【问题标题】:Script not working with changing proj structure脚本不适用于更改项目结构
【发布时间】:2017-11-23 14:46:48
【问题描述】:

我有以下文件 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 folder 中,它会创建tar,但它无效……知道我应该在此处更改脚本 什么以适应新项目结构体?

EDIT1

之前生成的结构如下

tmp 
  myapp
    myapp
    myapp_mac
    myapp_win64.exe
  myapp.tar.gz

Charles Duffy的答案中尝试了脚本后,我得到了以下内容

tmp 
  myapp
    myapp
    myapp_mac
    myapp_win64.exe

tar 文件丢失了,知道吗?

【问题讨论】:

  • @Flimzy - 你能告诉我怎么做吗?
  • @Flimzy - 它与代码无关,它只是打包,代码并没有完全一样地改变它,只是项目结构改变了
  • 抱歉,问题是,正如错误消息所表明的那样,您的项目目录myapp 现在没有 go 源代码。你不能编译任何东西。尝试编译myapp/util
  • @Flimzy - 这就是我试图将脚本移动到 server 文件夹并且它工作的原因,但我怀疑它没有看到 utils 文件夹和那里的 go 文件。 ...
  • 顺便说一句,env 完全没有必要。 GOOS=windows GOARH=amd64 go build -o /tmp/myapp/myapp_win64.exe 会做同样的事情(仅在单个命令期间设置 GOOS 和 GOARCH 环境变量)。

标签: linux bash shell go sh


【解决方案1】:

要更改脚本,请添加以下行:

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,因为它不存在)。
  • 脚本的退出状态始终是最后一个命令的退出状态,因此不需要显式的错误处理。

【讨论】:

  • 我应该在哪里做以及它应该如何解决不同结构的问题?
  • 结构的不同之处在于现在有一个src 目录,并且您的代码已移入其中。如果您运行go build 之前执行此操作,那么现在将在您的源目录中完成构建。
  • 嗨谢谢,我试过了,我得到了以下错误:rm: /tmp/myapp: No such file or directory rm: /tmp/myapp.tar.gz: No such file or directory can't load package: package myapp/src: no Go files in /Users/i023223/go/src/myapp/src
  • 现在它不会在 tmp 文件夹中创建 tar 文件,知道可能是什么问题吗?我所做的是将make.sh 复制到'make1' 文件到同一位置root project 并完全按照您的代码执行...
  • 我猜第一个错误'rm'并不重要,但no Go files...更重要如何克服它......?
【解决方案2】:

您的脚本执行go build 而不指定它需要编译的包。默认情况下,go 工具将在当前目录中查找 Go 源文件。没有,因为您已将它们移到别处。

尝试在go build 命令的末尾添加软件包列表。请注意,包名应包含相对于GOPATH 目录的完整路径。

请参阅文档here

【讨论】:

  • 谢谢,但我尝试将 make.sh 移动到 server 文件夹,但它确实有效......不确定在这种情况下它如何引用“utils”文件夹...... ,您能否举例说明您的建议?
  • server.go尝试改成import "myapp/src/utils"
  • 非常感谢,我已经这样做了(否则我会收到并发症错误),但它不起作用,同样的问题.....还有其他想法吗?
  • 顺便说一句,我不是 bash 脚本专家,我了解其中的大部分内容(不是由我创建的......)但不确定 3 件事:1.go get ./... `./.. .` 路径 2. go build -o 这到底是做什么 3. 环境 env GOOS 为什么需要它?非常感谢!!!
  • @H4xorPL - 谢谢!
【解决方案3】:

我相信应该这样做

#!/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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多