使用Go語言在MacOS建立一個自定義的命令行工具

原文連接: https://idoubi.cc/posts/create-a-cli-tool-in-macos/

使用 MacOS 作開發的朋友都知道,咱們通常會使用 Homebrew 作軟件包管理,常常會用到 brew install [soft] 來安裝各類各樣的命令行軟件。今天經過一個百科查找的命令行工具(tellme)示例,咱們來學習一下如何使用 Go 語言開發本身的命令行軟件。linux

咱們須要用到 cobra 這個 Go 模塊來作命令行工具開發,這個開源庫實際上是對 Go 官方庫 flag 的一個封裝,能夠簡化獲取參數的操做。git

建立命令行項目

  • 開啓 Go Module
export GO111MODULE=on
  • 安裝 cobra 工具
go get -u github.com/spf13/cobra/cobra
  • 建立命令行項目
# 建立項目目錄
mkdir -p /data/idoubi/tellme && cd /data/idoubi/tellme

# 定義模塊
go mod init github.com/idoubi/tellme

# 初始化命令行項目
cobra init --pkg-name github.com/idoubi/tellme
  • 檢測運行
go run main.go -h

執行完上述操做後,若是控制檯輸出了幫助信息,證實咱們的命令行項目建立成功了。github

新建子命令

  • 新建子命令
cobra add baike
  • 編寫業務邏輯

在生成的子命令文件 /data/idoubi/tellme/cmd/baike.go 中編寫子命令須要實現的業務邏輯。golang

package cmd

import (
    "fmt"
    "os"
    "os/exec"
    "runtime"

    "github.com/spf13/cobra"
)

var (
    platform string
)

var openCmds = map[string]string{
    "windows": "cmd /c start",
    "darwin":  "open",
    "linux":   "xdg-open",
}

var baikeCmd = &cobra.Command{
    Use:     "baike",
    Aliases: []string{"bk", "wk", "wiki"},
    Short:   "find things in baike site",
    Args:    cobra.ExactArgs(1),
    Run: func(cmd *cobra.Command, args []string) {
        err := findInBaike(args[0], platform)
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
    },
}

func init() {
    rootCmd.AddCommand(baikeCmd)
    baikeCmd.Flags().StringVarP(&platform, "platform", "p", "baidu", "platform to find things")
}

// 百科查找
func findInBaike(keyword, platform string) error {
    var link string
    // 百度百科搜索
    if platform == "baidu" || platform == "bd" {
        link = fmt.Sprintf("https://baike.baidu.com/item/%s", keyword)
    }
    // 互動百科搜索
    if platform == "hudong" || platform == "baike" || platform == "hd" {
        link = fmt.Sprintf("http://www.baike.com/wiki/%s", keyword)
    }
    // 維基百科搜索
    if platform == "wikipedia" || platform == "wiki" || platform == "wp" {
        link = fmt.Sprintf("https://zh.wikipedia.org/wiki/%s", keyword)
    }
    if link == "" {
        return fmt.Errorf("invalid platform")
    }
    goos := runtime.GOOS
    opencmd := "open"
    opencmd, ok := openCmds[goos]
    if !ok {
        return fmt.Errorf("can not open link in %s", goos)
    }
    if err := exec.Command(opencmd, link).Start(); err != nil {
        return err
    }

    return nil
}

命令測試

  • 項目中運行

在命令行項目目錄下,經過 go run 能夠直接運行,查看輸出結果。shell

# 在百度百科查看信息
go run main.go baike 周杰倫

# 在維基百科查看信息
go run main.go bk -p wp 周杰倫

上述的 baike 是咱們建立的子命令,bk 是子命令別名,-p 是子命令標識,用於指定百科平臺。周杰倫 是接收的參數。macos

  • 編譯運行

在命令行項目目錄下,經過 go build 能夠將項目編譯成一個二進制文件,經過 ./tellme 能夠直接運行二進制文件查看輸出。windows

# 編譯
go build -o tellme

# 運行
./tellme -h
  • 交叉編譯

除了在 MacOS 中使用外,咱們還但願能在 linux 和 windows 系統中使用咱們的命令行工具。這種狀況下咱們須要用到交叉編譯。ruby

# 下載交叉編譯工具
go get -u github.com/mitchellh/gox

# 編譯成指定平臺的可執行文件
gox -osarch "windows/amd64 linux/amd64 darwin/amd64"
  • 全局執行

編譯完成後,咱們能夠建立一個軟鏈接,讓命令行工具能夠在任何路徑下全局執行。app

# 建立軟鏈接
ln -s /data/idoubi/tellme/tellme_darwin_amd64 /usr/local/bin/tm

# 全局執行
tm -h

上傳到 Github

通過上述的幾個步驟,咱們已經完成了一個簡單的命令行工具的編寫與測試工做,接下來須要把軟件發佈出去讓全部人使用。工具

# 推送代碼到github
cd /data/idoubi/tellme
go init
git add .
git commit -m "a cli tool used in macos"
git push origin master

# 發佈一個版本
git tag -a v0.1.0 -m "first version"
git push origin --tags

上傳到 Github 完成後,咱們能夠在項目的 release 頁面看到這個項目的版本信息和源碼下載文件 https://github.com/idoubi/tellme/releases/tag/v0.1.0,咱們能夠編輯發佈信息,上傳交叉編譯後獲得的各個平臺的二進制文件,方便不一樣平臺的用戶在這裏直接下載二進制文件來使用咱們的軟件。

建立 Homebrew 軟件

對於 MacOS 用戶,通常都是使用 Homebrew 來安裝和管理各類軟件,咱們但願把本身開發的命令行軟件發佈到 Homebrew,讓用戶能夠方便的使用 brew install tellme 來安裝。

  • 建立 Homebrew 軟件

咱們能夠在 Github 上覆制軟件源碼包下載地址,在 MacOS 經過 brew create [source] 建立 Homebrew 軟件包。

brew create https://github.com/idoubi/tellme/archive/v0.1.0.tar.gz

執行上述命令完成後,會在 /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ 目錄生成一個 tellme.rb 文件,即咱們的 Homebrew 軟件定義文件,在此文件中定義了咱們的軟件在 MacOS 中要怎麼安裝。

  • 編輯軟件定義文件

由於咱們這個命令行軟件是用 Go 語言編寫的,在 Homebrew 軟件定義文件中,咱們能夠指定軟件的安裝依賴於 go:build,而且定義好 install 方式。

class Tellme < Formula
  desc "a cli tool to get information."
  homepage "https://github.com/idoubi/tellme"
  url "https://github.com/idoubi/tellme/archive/v0.1.0.tar.gz"
  sha256 "b0c14c0e9f02e065917262a7c0d16e205097cc4d10c01e03ad93b4cd737cf81d"

  depends_on "go" => :build

  def install
    system "go", "build", "-o", bin/"tellme"
  end

  test do
    system "false"
  end
end
  • 經過可執行文件建立 Homebrew 軟件

上面看到的是經過 Go 源碼編譯的方式定義 Homebrew 軟件的安裝方式,咱們還能夠經過下載可執行二進制的方式定義 Homebrew 軟件包的安裝,好比經過交叉編譯生成可執行文件。

基於可執行文件建立 Homebrew 軟件包:

brew create https://github.com/idoubi/tellme/releases/download/v0.1.0/tellme_darwin_amd64.tar.gz

編輯 Homebrew 軟件包的定義文件 tellme.rb:

class Tellme < Formula
  desc "a cli tool to get information"
  homepage ""
  url "https://github.com/idoubi/tellme/releases/download/v0.1.0/tellme_darwin_amd64.tar.gz"
  sha256 "164787b02050faef0d5776ca86d27d15b26fe28493f95ba2e705ba2e30026c94"

  def install
    bin.install "tellme_darwin_amd64" => "tellme"
  end

  test do
    system "false"
  end
end
  • 安裝 Homebrew 軟件

建立完 Homebrew 軟件後,咱們經過 brew install tellme 就能夠基於本地生成的/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/tellme.rb 文件來安裝咱們的命令行軟件了。

若是安裝報錯了,能夠經過 brew edit tellme 繼續編輯 Homebrew 軟件定義文件。

發佈 Homebrew 軟件

通過上面的步驟,咱們建立了一個在 MacOS 經過 Homebrew 安裝的軟件,接下來咱們須要把這個軟件發佈出去,讓用戶可以經過簡單的 brew 命令直接安裝使用。

  • 發佈到 Github 倉庫
# 建立軟件倉庫
mkdir -p /data/idoubi/homebrew-tools && cd /data/idoubi/homebrew-tools

# 複製軟件定義文件到倉庫目錄
cp /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/tellme.rb /data/idoubi/homebrew-tools/

# 推送到 Github 倉庫
git init
git remote add origin https://github.com/idoubi/homebrew-tools.git
git add .
git commit -m "a homebrew soft named tellme"
git push origin master
  • 安裝軟件

軟件定義文件推送到 Github 倉庫後,能夠刪除本地的 /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/tellme.rb 文件。

任何人能夠經過下面兩行命令在本身的 MacOS 系統中使用咱們開發的命令行軟件。

# 鏈接軟件倉庫
brew tap idoubi/tools
# 從軟件倉庫安裝軟件
brew install tellme

總結

前面的內容簡單介紹瞭如何使用 Go 語言來建立一個在 MacOS 使用的命令行軟件,須要開發者熟悉 MacOS 中 Homebrew 軟件包管理工具的使用以及 Go 語言。後面咱們能夠展開更多的想象,在咱們的命令行工具中添加查天氣、搜歌詞、翻譯、時間類型轉換等各類特性功能。

  • 源碼

命令行軟件源碼:tellme

Homebrew倉庫:homebrew-tools

參考

相關文章
相關標籤/搜索