微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-脚本无法与更改proj结构一起使用

我有以下文件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照原样放置在服务器文件夹中,它会创建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] 举报,一经查实,本站将立刻删除。

相关推荐