linux - 脚本不适用于更改项目结构

标签 linux bash shell go sh

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

相关文章:

regex - 使用 REGEX 与 Groovy 和 SED 替换值

linux - jar 文件的 Systemd 服务在几分钟后出现 "operation timed out"错误或停留在 "activating mode"

bash - Bash脚本中的Sudo SU无需询问用户密码

linux - 如何在 bash shell 脚本中使用 sed 和 egrep

linux - Linux 的 crontab 天异常(exception)

linux - 尝试在 Ubuntu 上的 NASM 上运行 .asm 文件时出错

linux - 解压缩连接两个 gzip 文件的结果是否总是等于以原始和解压缩形式连接两个文件的结果?

bash - 如何在 shell 脚本中优雅地处理内存不足

linux - Shell多日志监控与关联

macos - 在 Swift 中运行 shell 命令