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.gogo 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

4 回复

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 文件。解决方案:

  1. 确认文件结构
tree ~/todo

应该会显示类似:

.
├── main.go
└── cmd/
    ├── root.go
    └── main.go  # 问题所在
  1. 移除或重命名 cmd/main.go
mv ~/todo/cmd/main.go ~/todo/cmd/main.go.bak
  1. 或者修改 cmd/main.go 的包声明(如果不是真正的入口点):
// 将 package main 改为 package cmd
package cmd
  1. 更新模块引用
cd ~/todo
go mod init github.com/neut0ne/todo
go mod tidy
  1. 运行程序
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 的文件。

回到顶部