所以我正试图用谷歌的应用程序引擎运行我的go应用程序。当我运行goapp server
时,我得到这个错误:
go-app-builder: Failed parsing input: app file model.go conflicts with same file imported from GOPATH
这是我的项目布局:
.
├── model
│ └── model.go
├── reqres
│ └── reqres.go
├── app.yaml
├── service.go
├── main.go
└── transport.go
如果我在没有应用程序引擎的情况下运行它,我不会出现任何错误,应用程序运行良好。
根据我的经验,你会出现这个错误,因为你的项目文件夹也在你的GOPATH下。"goapp"可以克隆你的项目文件夹,并根据go环境GOPATH和GOROOT构建它。。。这样做,它会为您在项目中声明的所有包找到重复的符号。
以下是go appengine文档中的解释
如果您在GOPATH中包含包源代码,则必须小心,不要将源代码放在应用程序引擎项目中包含App.yaml文件的任何目录下。如果发生这种情况,包可能会被加载两次,一次是针对相对于模块目录的路径,一次则是针对完全限定路径。这可能会导致细微的问题,因此Go SDK会扫描您的项目和GOPATH,检测到这种情况,并将其报告为错误。
在同一个链接下,你会发现谷歌为你的项目结构提供了一些建议,其中之一是(你的项目违反了这一准则):
不要在模块的目录中包含任何子目录。
如果你想要一个包含应用程序定义和go包的存储库,我鼓励你采用愚蠢的结构:
projectRoot
|- modules
| |- myModule1
| | |- init.go // router pattern to handler
| | |- myModule1.yaml // configuration for the module
| |- myModule2
| |- init.go // router pattern to handler
| |- myModule2.yaml // configuration for the module
|
|- pkg
| |- myModule1
| | |- *.go // sources, subfolders(packages)
| | // with handlers and business code
| |- myModule2
| | |- *.go // sources, subfolders(packages)
// with handlers and business code
这种结构很方便,并提高了调试体验,正如在使用visual studio代码调试Go appengine模块的文章中所解释的那样