Help us understand the problem. What is going on with this article?

作ってみた:Go開発環境のディレクトリとファイルと、コマンドを作ってくれるCLI

More than 1 year has passed since last update.

$GOPATH 対象ディレクトリと、その中で作成するプロジェクト用のソース用ディレクトリを作成します。
vgoを使った開発の場合のために、vgoのgo getコマンドの作成と、go.modファイルの作成をします。
Go初心者で、プロジェクト作成の勉強のために練習で作ったものです。
環境構築の手順をプログラムに落とし込んだ感じ。

リポジトリあります。この時期のものから改良されている可能性があります。
https://github.com/kentfordevgithub/goprj

ソース

goprj.go
package main

import (
    "flag"
    f "fmt"
    "os"
)

const (
    optPath    = "gopath"
    optPackage = "package"
    optVgo     = "vgo"
    optStart   = "start"
    envGopath  = "GOPATH"
    dirSrc     = "/src"
    fileGomod  = "go.mod"
    permission = 0777
)

var (
    path        = flag.String(optPath, "", "target $"+envGopath)
    packageName = flag.String(optPackage, "", "project package")
    start       = flag.Bool(optStart, false, "first create.\nmake dir")
    vgo         = flag.Bool(optVgo, false, "print vgo command\n"+
        "with -"+optStart+": create "+fileGomod+", print go get command")
)

// how to run: ./goprj -gopath $HOME/go_test -package github.com/abcde/fghij -start -vgo
func main() {
    flag.Parse()

    if *path == "" || *packageName == "" {
        f.Println("err:require -" + optPath + ", -" + optPackage)
        return
    }

    srcDir := *path + dirSrc
    if err := gopathSet(srcDir); err != nil {
        f.Println(err)
        return
    }

    packageDir := srcDir + "/" + *packageName
    if err := packageSet(packageDir); err != nil {
        f.Println(err)
        return
    }

    if *vgo {
        if err := vgoSet(packageDir); err != nil {
            f.Println(err)
            return
        }
    }

}

func gopathSet(srcDir string) error {
    if *start {
        if err := os.MkdirAll(srcDir, permission); err != nil {
            return err
        }
    }

    f.Println("export " + envGopath + "=" + *path)
    return nil
}

func packageSet(packageDir string) error {
    if *start {
        if err := os.MkdirAll(packageDir, permission); err != nil {
            return err
        }
    }
    return nil
}

func vgoSet(packageDir string) error {
    if *start {
        if _, err := os.Create(packageDir + "/" + fileGomod); err != nil {
            return err
        }
        f.Println("go get -u golang.org/x/vgo")
    }

    f.Println("export PATH=$PATH:$GOPATH/bin")
    return nil
}

実行結果

コマンドが下記の場合の出力結果。

$ ./goprj -gopath $HOME/go_test -package github.com/abcde/fghij -start -vgo

ディレクトリ作成結果

$HOME/go_test
 - src
    - github.com
        - abcde
            - fghij
                - go.mod

標準出力

export GOPATH=$HOME/go_test
go get -u golang.org/x/vgo
export PATH=$PATH:$GOPATH/bin
mediado
私たちメディアドゥは、電子書籍を読者に届けるために「テクノロジー」で「出版社」と「電子書店」を繋ぎ、その先にいる作家と読者を繋げる「電子書籍取次」事業を展開しております。業界最多のコンテンツラインナップとともに最新のテクノロジーを駆使した各種ソリューションを出版社や電子書店に提供し、グローバル且つマルチコンテンツ配信プラットフォームを目指しています。
https://mediado.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away