我有以下文件 make.sh
正在处理以下项目:
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
现在当我运行“make.sh”时出现错误:
can't load package: package myapp: no Go files in /Users/i023333/go/src/myapp
知道如何调整它吗?
我尝试将 make.sh
按原样放在 server 文件夹
中,它创建了 tar,但它无效……知道我应该更改什么 脚本 这里采用新的项目结构?
编辑1
之前生成的结构如下
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
),但是不要死于我们预期的错误(例如复制资源
,因为它不存在)。 - 脚本的退出状态始终是最后一个命令的退出状态,因此不需要在那里进行显式错误处理。
关于linux - 脚本不适用于更改项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458133/