我有以下文件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/