代码之家  ›  专栏  ›  技术社区  ›  andig

go模块如何使用可安装命令?

go
  •  5
  • andig  · 技术社区  · 8 年前

    go generate .

    如何安装特定的构建依赖项(例如github.com/aprice/embed/cmd/embed)并从哪个文件夹运行该特定工具?是 go get 这样做的正确工具?

    4 回复  |  直到 8 年前
        1
  •  6
  •   coolaj86    5 年前

    如果你出错了

    我没有看到要添加到go.mod中的依赖项,因此出现以下错误:

    internal/tools/tools.go:6:5: import "github.com/UnnoTed/fileb0x" is a program, not an importable package
    

    我不是百分之百的清楚事情的顺序,但是我做了所有这些事情:

    使用“工具”包

    我做了一个 tools

    mkdir -p internal/tools
    

    我把工具包放在里面(如上所述):

    internal/tools/tools.go :

    // +build tools
    
    package tools
    
    import (
        _ "github.com/UnnoTed/fileb0x"
    )
    

    主要地

    // +build foo
    

    但是,您不能使用 ignore

    // +build ignore
    
    // NO NO NO NO NO
    // `ignore` is a special keyword which (surprise) will cause
    // the file to be ignore, even for dependencies
    

    更新go.mod

    最佳方法 go mod tidy :

    go mod tidy
    

    go.mod :

    go install github.com/UnnoTed/fileb0x # didn't seem to do the trick
    go get
    go generate ./...
    go build ./...
    go install ./...
    go mod vendor
    

    git reset rm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod 我发现 一个人做得很好。

    供应商

    go mod vendor
    

    它将从go.mod获取所有依赖项

    -mod=vendor 在任何情况下 Makefile 是的, Dockerfile 或其他脚本。

    go fmt -mod=vendor ./... # has a bug slated to be fixed in go1.15
    go generate -mod=vendor ./...
    go build -mod=vendor ./...
    

    包括 go build go get go install ,以及任何 go run go generate (甚至是 去生成

    //go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
    package main
    
    // ...
    
        2
  •  3
  •   Community Mohan Dere    6 年前

    https://github.com/golang/go/issues/25922 对我很有帮助,尤其是

    当对模块使用只生成依赖项时,主要的一点是版本选择(而不是安装这些!)

    //go:generate go run golang.org/x/tools/cmd/stringer ARGS
    

    还有回购的最佳实践: https://github.com/go-modules-by-example/index/blob/master/010_tools/README.md

        3
  •  2
  •   Peter saif iqbal    8 年前

    约定是添加名为“tools.go”的文件,该文件由生成约束保护,并导入所有必需的工具:

    // +build tools
    
    package tools
    
    import (
        _ "github.com/aprice/embed/cmd/embed"
    )
    

    https://github.com/golang/go/issues/25922#issuecomment-412992431

    然后这些工具像往常一样安装在一个

    • $戈宾
    • $家/去/宾

    你也可以跟着 https://github.com/golang/go/issues/27653

        4
  •  2
  •   Yoni Samlan    7 年前

    tools.go 是一个伟大的解决方案,如果你正在建立一个应用程序或服务。但如果你在建图书馆, 工具.go indirect 依赖关系,以及 go mod tidy 会把他们拉进来的 所有可能的目标 ). 这并不是世界末日,因为这些模块永远不会出现在消费者实际构建的二进制文件中,但仍然很混乱。

    https://github.com/myitcv/gobin/issues/44 https://github.com/izumin5210/gex .

    首先,我安装 gex 全球地:

    GO111MODULE=off go get github.com/izumin5210/gex/cmd/gex
    

    那么 在实际使用gex之前 我创建了这样一个结构:

    myproject/
    \
      - go.mod: module github.com/ysamlan/myproject
      \
        internal/
        \
          tools/
           - go.mod: module github.com/ysamlan/myproject/tools
    

    cd internal/tools 然后跑 gex --add (sometool) internal/tools/bin . CI脚本和其他想在本地构建我的东西的人只需要运行 cd internal/tools && gex --build

    关键在于创造 internal/tools/go.mod 使用 不同的 模块路径,然后仅运行 从那个目录。