基于每个项目自动定义GOPATH

Dan*_*ill 26 bash go .bash-profile

对于我创建的每个项目,我export GOPATH={path_to_project}每次进入项目目录时都必须这样做.必须有一个更简单的方法.是不是有某种方法可以为给定目录创建.bashrc或.bash_profile文件来定义该项目的GOPATH?

例如,我有两个项目A和B.如果我在项目之间移动时没有重新定义单个GOPATH,那么两个项目的二进制文件将存储在同一个地方.更重要的是,第三方库的二进制文件将存储在同一个地方,因此我无法在每个项目的基础上维护同一个库的多个版本.

但是,如果我能够在每个项目的基础上定义GOPATH,那么所有二进制文件和第三方库都依赖于项目.这似乎是在大多数其他语言环境中处理包管理的常用方法(ruby rbenv,python vertiualenv等)

Von*_*onC 20

(2018年第二季度:请注意,对于vgo(现在的"模块")项目,GOPATH最终可能会弃用以支持基于项目的工作流程.这将避免GOPATH我在两年前提出的基于手动项目的建议

使用Go 1.11(2018年8月),GOPATH可以选配模块.


你有类似的想法表达了管理多个GOPATH迪尔斯轻松,由赫伯特·菲舍尔(hgfischer),在Linux/Unix环境(在基地的问题已经提到在上面的注释):

只需在您的~/.bashrc(或~/.bash_profile)中包含以下代码段,然后重新加载您的shell环境即可source ~/.bashrc.
此代码段将创建一个shell函数,该函数将cd使用自定义命令覆盖内置命令,该命令扫描输入的目录,以及上面的所有其他命令,以查找名为的文件.gopath.

cd () {
    builtin cd "$@"
    cdir=$PWD
    while [ "$cdir" != "/" ]; do
        if [ -e "$cdir/.gopath" ]; then
            export GOPATH=$cdir
            break
        fi
        cdir=$(dirname "$cdir")
    done
}
Run Code Online (Sandbox Code Playgroud)

现在,您只需要.gopath在每个目录中创建一个文件,每次GOPATH进入此目录时,重新定义的cd函数都会将GOPATH当前环境设置为此目录.


2017年更新:如果您不想修改您的环境,您仍然可以在GOPATH每个项目中使用一个,src方法是在Visual Studio Code(vscode,这是一个多平台IDE)中打开该项目的文件夹,并结合扩展名" 转到Visual Studio代码 ".

在该IDE中,您可以:

  • GOPATH在一个名为的环境中保持全球独特性go.toolsGopath.
  • GOPATH用一个叫做的设置来推断你的当前go.inferGopath

vscode用户设置

这样,VSCode将在您的全局中安装一组工具GOPATH(您也可以在VSCode外部使用).
请参阅" 往那边走,转到扩展取决于工具上 ": ,godep,,golint ,...gurugodoc

然而,您GOPATH的项目将是src的父文件夹:

当地的GOPATH

当您从IDE编译/安装项目时,这可以工作.
如果您想从命令行执行此操作,上面的原始答案仍然适用.


小智 10

您可以使用autoenv之类的工具来设置在cd进入特定目录时自动执行的脚本.

出于您的目的,示例/happy/go/path/yay/.env文件可能如下所示:

export GOPATH="/happy/go/path/yay"
export PATH="$GOPATH/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

  • 每当有人进入目录时,这不会扩展PATH变量吗? (3认同)

jos*_*hlf 5

我会写一个脚本,它可以从当前目录推断出正确的GOPATH,然后别名go命令首先调用这个脚本.例如,一个非常简单的实现:

#!/bin/bash
# infer-gopath.sh

pwd
Run Code Online (Sandbox Code Playgroud)

然后,在.bash_aliases中(或者你保留别名的地方):

alias go='GOPATH=$(infer-gopath.sh) go'
Run Code Online (Sandbox Code Playgroud)

这设置GOPATHinfer-gopath.sh仅用于调用go命令的任何输出,因此它不会对shell产生任何持久影响.


小智 5

I know this is not very clever but I find that if I simply go to the base directory of the go project where I have the src, pkg and bin folders I can simply type:

export GOPATH=$(pwd)
Run Code Online (Sandbox Code Playgroud)

and thats it all good!