【问题标题】:Golang doesn't recompile some fileGolang 不会重新编译某些文件
【发布时间】:2016-09-05 22:39:44
【问题描述】:

我刚刚收到一个错误:

服务器

server/server.go:73: undefined: foo.MyName

一开始我不明白,我试图更改我的函数名称等。 所以我创建了一个名为 MyName() 的函数,它返回一个字符串,这是我的名字..

但是,错误又出现了.. 一个多小时后,我只是尝试在包 foo 中注释我的所有代码!我想说f**k,此刻...#PS:我还评论了server.go:73行......并且......它编译并且完全有效?!

我评论了我的代码,但它似乎还在这里?!所以现在我的问题是:

Golang 重新编译某些文件有问题吗?

#----------------------------------------

工作区

pkg

    linux_amd64

src

   algo  database_sql  github.com  golang.org  GoogleAPI  googlemaps.github.io  main  main.go  models  myDebug  router  server

我正在制作“go build main.go”

我还阅读了How to Write Go Code 没有找到任何解决方案...

一些提示?

【问题讨论】:

  • 如果您需要帮助更新您的问题以发布最小代码以重新创建问题...否则很难猜测
  • go build filename.go 只构建一个文件,而不查看您的其他文件。通常,您只想从项目目录执行“安装”并让它“正常工作(tm)”并安装到 $GOPATH/bin。但是如果你真的想构建一组文件,在命令行中列出所有文件,比如 go build *.go (但这是一个坏习惯)
  • 我不同意你大卫,如果我执行“go build main.go”并且在这个 file.go 中,我添加了一个导入,例如 algo,它会编译两者,我从我使用 golang 开始就这样做
  • @MaximeGuittet David 在 go build main.go 中是正确的,只是指示编译器构建一个文件。因此,每次构建 main 时,它可能使用相同的 server.go 二进制文件。因为你没有告诉它这样做。
  • 它特定于 go 版本。这个旧帖子中没有提供。不值得保留这个。

标签: go build compilation


【解决方案1】:

所以我猜你的开发树看起来像这样:

src
├───algo
├───database_sql
├───github.com
├───golang.org
├───GoogleAPI
├───googlemaps.github.io
├───main
├───main.go
├───models
├───myDebug
├───router
└───server
    └───server.go

正如您在How to Write Go Code 中看到的那样,您应该有一个项目文件夹,因此 main.go 应该是 someproject/main.go,然后您可以使用 go build 构建整个项目。

理想情况下,您会希望将所有项目都放在一个文件夹中作为其网址,例如github.com/yourname/projectname。我建议您遵循此约定,即使特定项目不会公开访问。我将所有项目(甚至那些不在 github 中的项目)都保存在我的 github/my user 文件夹中。这样可以更轻松地查找和分类所有软件。

如果您想构建一个项目及其所有依赖项(在本例中为 server/server.go),您可以执行 go build ./...

您也可以进入服务器包并执行go install 安装构建并重新安装包。

所以你应该有这样的东西:

GOPATH
├───bin
|   └───main (this will have the name of the folder)
├───pkg (this routes match the ones on src)
|   └───linux_amd64
|       └───server.a
└───src
    ├───algo
    ├───database_sql
    ├───github.com
    ├───golang.org
    ├───GoogleAPI
    ├───googlemaps.github.io
    ├───main
    |   └───main.go
    ├───models
    ├───myDebug
    ├───router
    └───server
        └───server.go

然后转到src/main/ 并执行go build ./... 以构建所有依赖项。理想情况下,您需要执行go install ./...,以便将库安装在正确的路径上,并且您的二进制文件也会在正确的路径中创建,而不是在src 文件夹中。如果这样做,您将需要运行二进制文件bin/main。我建议您将GOPATH/bin 添加到您的路径中,这样您就可以安装您的软件并直接运行它而无需进入 bin 文件夹。

您导入或使用服务器包的方式可能存在一些错误。如果您不发布代码,这是我能做的最好的事情。

编辑:经过进一步思考,我相信我发现了错误。您正在使用go build 来构建整个项目,并且在某些时候您在服务器库上使用了go install。所以现在go build 正在使用pkg 中已经编译的库版本,所以如果你想解决问题,请在服务器文件上执行go install 或在主文件夹上执行go install ./...

这不是 Go 中的错误,通常您不希望库中的更改破坏您的代码,因此您必须记住在尝试您的代码之前安装新版本的库。

【讨论】:

  • 谢谢你的回答 :) 我没有放代码,因为它不是关于代码的,我认为这只是关于文件组织,因为,我评论了我的代码,它仍然编译 x) 所以它不能是关于代码,只是可能因为某些文件不在好地方,就像你解释的那样,或者因为 golang 生成了一些临时文件:)
  • @MaximeGuittet 我想我解决了你的问题。我编辑了帖子。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多