脚本不能改变proj结构

我有以下文件make.sh这是工作在以下项目:

 myapp utils run.go auth.go server.go make.sh 

当我运行这个脚本时,它会创build预期的焦油,一切正常!

 #!/bin/sh go get ./... rm -r /tmp/myapp rm /tmp/myapp.tar.gz mkdir /tmp/myapp go build -o /tmp/myapp/myapp_mac env GOOS=windows GOARH=amd64 go build -o /tmp/myapp/myapp_win64.exe env GOOS=linux GOARCH=amd64 go build -o /tmp/myapp/myapp cp -R ./resources /tmp/myapp/ cd /tmp tar -czf myapp.tar.gz myapp 

现在我需要将项目结构更改为以下内容:

 myapp make.sh src utils run.go auth.go server server.go 

现在当我运行“make.sh”时,我得到一个错误:

 can't load package: package myapp: no Go files in /Users/i023333/go/src/myapp 

任何想法如何适应它?

我尝试把make.sh放在server folder里面,它创build了tar但是它不是有效的…任何想法我应该改变这个脚本来采用新的项目结构吗?

EDIT1

在产生的结构如下所示之前

 tmp myapp myapp myapp_mac myapp_win64.exe myapp.tar.gz 

Charles Duffy的答案中尝试了脚本之后,我得到了以下结果

 tmp myapp myapp myapp_mac myapp_win64.exe 

该tar文件丢失,任何想法?

要更改脚本,请添加以下行:

 cd src/server || exit 

在任何需要关心源头的行动之前。 从而:

 #!/bin/sh cd src/server || exit # <--- ADD THIS LINE go get ./... || exit rm -rf /tmp/myapp # aside: using hardcoded names in /tmp is a Really Bad Idea. rm -f /tmp/myapp.tar.gz mkdir -p /tmp/myapp go build -o /tmp/myapp/myapp_mac || exit GOOS=windows GOARH=amd64 go build -o /tmp/myapp/myapp_win64.exe || exit GOOS=linux GOARCH=amd64 go build -o /tmp/myapp/myapp || exit cp -R ./resources /tmp/myapp/ || exit cd /tmp || exit tar -czf /tmp/myapp.tar.gz myapp 

这就是说,我会建议,而不是写这个:

 #!/bin/bash basedir=$(cd -- "${BASH_SOURCE%/*}" && pwd) || exit rm -rf -- "$basedir/build" || exit mkdir -p -- "$basedir/"{build,dist} || exit build() (cd src/server && GOOS=$1 GOARCH=$2 exec go build -o "$basedir/build/$3") build darwin amd64 myapp_mac || exit build linux amd64 myapp || exit build windows amd64 myapp_win64 || exit if [[ -d "$basedir/resources" ]]; then cp -PR -- "$basedir/resources/." "$basedir/build/resources" || exit fi tar -czf "$basedir/dist/myapp.tar.gz" -C "$basedir/build" . 

注意:

  • 我们正在相对于脚本的位置进行操作,所以即使从不同目录运行它也可以运行(您可以运行./myapp/build ,并将builddir设置为./myapp的路径)。
  • 我们没有使用/tmp (如果我们想要安全地这样做,那么我们会有一些像builddir=$(mktemp -t -d myapp-build.XXXXXX) ,然后rm -rf "$builddir"结束)。
  • 我们使用#!/bin/bash shebang,它允许扩展名如[[ ]]$BASH_SOURCE ,而不是#!/bin/sh
  • 重复的操作被封装在一个函数中。
  • 我们总是死于错误,我们不期望( 包括如果resources不存在,则不能复制resources ),但是不会因我们所期望的错误(例如归档,因为它不存在而复制resources )而死亡。
  • 脚本的退出状态总是最后一个命令的退出状态,所以不需要显式的错误处理。

你的脚本执行go build编译而不指定它需要编译的软件包。 默认情况下, go工具将在当前目录中查找Go源文件。 没有,因为你已经把他们搬到别处了。

尝试在go build命令的末尾添加软件包列表。 注意,包名应该包含与GOPATH目录相关的完整路径。

请参阅这里的文档。

这应该这样做我相信

 #!/bin/sh cd src/server go get ./... rm -rf /tmp/myapp rm -f /tmp/myapp.tar.gz mkdir -p /tmp/myapp go build -o /tmp/myapp/myapp_mac env GOOS=windows GOARH=amd64 go build -o /tmp/myapp/myapp_win64.exe env GOOS=linux GOARCH=amd64 go build -o /tmp/myapp/myapp cd ../.. cp -R ./resources /tmp/myapp/ cd /tmp tar -czf myapp.tar.gz myapp/