Golang中运行`go run main.go`报错:`import ".../cmd" is a program, not an importable package`
Golang中运行go run main.go报错:import ".../cmd" is a program, not an importable package
我是Go语言的新手。我已经浏览了关于这个问题的资料,但找不到适用于我情况的解决方案。代码可在GitHub - neut0ne/todo: 用于学习Go的简单任务管理器获取。
我尝试运行一个程序。它使用了两个文件:main.go 和 cmd/root.go。
这是 main.go:
package main
import "github.com/neut0ne/todo/cmd"
func main (){
cmd.RootCmd.Execute()
}
这是 cmd/root.go:
package cmd
// 这是根命令。
import "github.com/spf13/cobra"
var RootCmd = &cobra.Command{
Use: "Todo",
Short: "Todo is a small and efficient task manager.",
// Long: `A Fast and intuitive basic task mamagement tool built with
// love by neut0ne and friends in Go.
// Complete documentation is available at http://todo.neut0ne.go`,
// Run: func(cmd *cobra.Command, args []string) {
// // Do Stuff Here
// },
}
我听说应该可以通过 go mod init ~/todo 来为程序创建一个模块,然后就能直接输入 todo 来运行程序。
输入 todo 没有任何反应。
在本地 ~/todo 目录下输入 go run main.go 会得到以下错误信息:
main.go:3:8: import “github.com/neut0ne/todo/cmd” 是一个程序,不是一个可导入的包
我已经运行了 go install root.go 和 go install cmd。
GOPATH: ~/code/go/src/github.com/neut0ne/todo
go version go1.14.2 darwin/amd64
我哪里做错了?
更多关于Golang中运行`go run main.go`报错:`import ".../cmd" is a program, not an importable package`的实战教程也可以访问 https://www.itying.com/category-94-b0.html
https://github.com/neut0ne/todo/cmd 不存在。你能分享导致错误出现的项目形式吗?
更多关于Golang中运行`go run main.go`报错:`import ".../cmd" is a program, not an importable package`的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我找到了一个变通方法。将 /cmd 目录重命名为其他名称后,它神奇地变成了一个包,并允许我运行程序。我将其重命名为 /cmdd。
但我仍然无法理解为什么 /cmd 被定义为一个程序而不是一个包。我见过很多其他 Go 仓库使用 /cmd。如果有人知道为什么会发生这种情况,我很乐意听取解释。
抱歉,正确的链接应该是:https://github.com/neut0ne/todo/tree/master/cmd
我认为我无法复现这个错误。现在使用 cmd 可以正常工作了。我使用 Cobra 添加了一个新命令,它会自动在根目录的 /cmd 目录下生成该命令,并遵循一些标准格式。
仍然不清楚为什么一开始 cmd 没有被解释为一个程序而是一个目录。我对目前的结果很满意,我将关闭这个问题。
这个错误是因为你的 cmd 目录下包含了 main 包文件。当目录中包含 func main() 时,Go 会将其视为可执行程序而非库包。
检查你的 cmd 目录,很可能存在一个 main.go 文件。解决方案:
- 确认文件结构:
tree ~/todo
应该会显示类似:
.
├── main.go
└── cmd/
├── root.go
└── main.go # 问题所在
- 移除或重命名
cmd/main.go:
mv ~/todo/cmd/main.go ~/todo/cmd/main.go.bak
- 或者修改
cmd/main.go的包声明(如果不是真正的入口点):
// 将 package main 改为 package cmd
package cmd
- 更新模块引用:
cd ~/todo
go mod init github.com/neut0ne/todo
go mod tidy
- 运行程序:
go run main.go
如果 cmd 目录确实需要独立的可执行文件,应该这样组织:
.
├── main.go # 主程序入口
├── cmd/
│ ├── root.go # package cmd
│ └── cli/
│ └── main.go # 独立的CLI工具
└── go.mod
示例修复后的结构:
// main.go 保持不变
package main
import "github.com/neut0ne/todo/cmd"
func main() {
cmd.RootCmd.Execute()
}
// cmd/root.go 保持不变
package cmd
import "github.com/spf13/cobra"
var RootCmd = &cobra.Command{
Use: "todo",
Short: "Todo is a small and efficient task manager.",
}
关键点是:import 的目录中不能包含 package main 的文件。

