myapp
utils
run.go
auth.go
server.go
make.sh
当我运行此脚本时,它将创建预期的tar,并且一切正常!
#!/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
can't load package: package myapp: no Go files in /Users/i023333/go/src/myapp
知道如何适应它吗?
我尝试将make.sh照原样放置在服务器文件夹中,它会创建tar,但它无效…我知道应该在这里更改脚本以采用新项目结构吗?
编辑1
在生成的结构之前如下
tmp
myapp
myapp
myapp_mac
myapp_win64.exe
myapp.tar.gz
在查尔斯·达菲的答案中尝试了脚本之后,我得到了以下内容
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.
>重复的操作封装在一个函数中.
>我们总是死于意外错误(包括如果资源不存在而无法复制资源),但也不会死于意外错误(例如由于资源不存在而归档复制) .
>脚本的退出状态始终是最后一条命令的退出状态,因此不需要在那里进行显式错误处理.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。