我的应用程序无法在没有将更改推送到远程存储库的情况下导入另一个本地包

阿苏哈

环境

GO111MODULE=on
golang:1.15.2-alpine

我想做的事

我在本地项目中实现了一些功能,我想在将更改推送到远程存储库之前确认行为。
但是我的项目无法访问新包。

错误文本

当 docker-compose run 'go build' 我得到他的错误。
'github.com/Asuha-a/URLShortener/api/pb/url' 和 'github.com/Asuha-a/URLShortener/api/utility' 都不存在于远程仓库中,因为它还没有被推送。

main.go:10:2: module github.com/Asuha-a/URLShortener/api@latest found (v0.0.0-20201114002535-3dac2ebd322a), but does not contain package github.com/Asuha-a/URLShortener/api/pb/url
main.go:12:2: module github.com/Asuha-a/URLShortener/api@latest found (v0.0.0-20201114002535-3dac2ebd322a), but does not contain package github.com/Asuha-a/URLShortener/api/utility

项目架构

我删除了一些看起来与此问题无关的文件。

$ tree                                                                                               
.                                                                                                    
├── api                                                                                                                                                                               
│   ├── Dockerfile                                                                                   
│   ├── go.mod                                                                                       
│   ├── go.sum
│   ├── main.go
│   ├── pb
│   │   ├── url // new package
│   │       ├── url_grpc.pb.go
│   │       ├── url.pb.go
│   │       └── url.proto
│   ├── services
│   │   ├── url
│   │   │   ├── db
│   │   │   │   ├── settings.go
│   │   │   │   └── url.go
│   │   │   ├── Dockerfile
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go // failed building
│   └── utility // new package
│       ├── jwt.go
│       └── url.go
├── docker-compose.yml

我试过的

我发现了这个问题。
在 Go 中不推送代码的情况下导入包的本地更改
这表示我可以通过添加“替换 MODULE_URL => /PATH/TO/MODULE/DIR”来访问本地包。

我像这样编辑了“api/services/url/go.mod”。

module github.com/Asuha-a/URLShortener/api/services/url

go 1.15

replace github.com/Asuha-a/URLShortener/api => ../../.
require (
    github.com/jackc/pgx/v4 v4.9.2 // indirect
    github.com/satori/go.uuid v1.2.0
    golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9 // indirect
    golang.org/x/text v0.3.4 // indirect
    golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
    google.golang.org/grpc v1.33.2
    gorm.io/datatypes v1.0.0
    gorm.io/driver/postgres v1.0.5
    gorm.io/gorm v1.20.6
)

但我收到了这个错误:

main.go:10:2: module github.com/Asuha-a/URLShortener/api@latest found (v0.0.0-20201114002535-3dac2ebd322a, replaced by ../../.), but does not contain package github.com/Asuha-a/URLShortener/api/pb/url
main.go:12:2: module github.com/Asuha-a/URLShortener/api@latest found (v0.0.0-20201114002535-3dac2ebd322a, replaced by ../../.), but does not contain package github.com/Asuha-a/URLShortener/api/utility

然后我尝试了完整路径'/home/asuha/go/src/github.com/Asuha-a/URLShortener/api'。

但我收到了这个错误:

main.go:10:2: github.com/Asuha-a/URLShortener/[email protected]: replacement directory /home/asuha/go/src/github.com/Asuha-a/URLShortener/api does not exist
main.go:12:2: github.com/Asuha-a/URLShortener/[email protected]: replacement directory /home/asuha/go/src/github.com/Asuha-a/URLShortener/api does not exist

我想知道

如何修复此错误?

沃尔克

先说一些基础知识:

  • 一个模块是一组版本控制在一起的包。
  • 模块在 go.mod 中声明了一个名称,例如 github.com/anyone/someproject
  • 一个包是通过它的导入路径导入的(导入路径基本上就是包标识)。
  • 属于模块的包必须具有以模块名称开头的导入路径。在上面的例子中,属于模块的任何包都github.com/anyone/someproject必须有一个导入路径,例如github.com/anyone/someproject/whatever/hierarchy/pkgname
  • 你永远不需要replace从同一个模块打包。replace用于更换其他模块。

你声明了模块

 module github.com/Asuha-a/URLShortener/api/services/url

这使您的模块名称为“github.com/Asuha-a/URLShortener/api/services/url”,并且仅具有导入路径的包,如模块“github.com/Asuha-a/URLShortener/api/services/url/I /really/like/deeply/nested/stuff" 将属于该包。

显然你的utility包(顺便说一句。不要做这样的包,这是基本的代码味道!)不属于你的模块:你可能尝试将它导入为“github.com/Asuha-a/URLShortener/api/utiliyt”但这不是模块“github.com/Asuha-a/URLShortener/api/services/url”的一部分。

该文件夹utility位于go.mod文件系统中文件“下方”这一事实并不能推翻您的模块在其第一行声明的事实:“我所有的包的导入路径都以 github.com/Asuha-a/URLShortener/api/ 开头服务/网址!其他任何东西都不属于我!”

您可能至少应该命名您的模块module github.com/Asuha-a/URLShortener/api(如果没有module github.com/Asuha-a/URLShortener)。

我敦促您(重新)阅读“如何编写 Go 代码”并坚持下去。

要点:模块实际上只是一组具有相同导入路径前缀(模块名称)版本化的包。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在没有确认活动的情况下从另一个应用程序从外部存储安装apk

如何在没有“ onSaveInstanceState之后无法执行此操作”的情况下打开另一个应用程序?

如何阻止Eddystone在没有我的应用程序的情况下将内容推送到手机

Git 将我的分支更改推送到另一个存储库

如何将子模块更改推送到另一个存储库

如何在不每次输入密码的情况下将更改推送到远程存储库?

在强制推送到另一个分支时,Git没有将新文件推送到远程

默认情况下如何将应用程序安装到另一个驱动器

如何在没有任何窗口(.exe)的情况下从其安装文件中静默安装另一个应用程序?C#

有没有办法将 Flutter 应用程序作为另一个包的依赖项导入和运行?

如何压缩所有提交历史记录并推送到另一个远程存储库中?

如何在没有 SSH 的情况下从我的计算机(通过 Node.js 应用程序)在本地远程访问 MySQL 数据库?

我想使用Parse.com的应用程序将推送通知从一个Android设备发送到另一个。

如何在不遇到生命周期问题的情况下将React / Redux应用程序嵌入另一个React / Redux应用程序?

从另一个存储库分支克隆后,推送到私有存储库

我可以将Intent发送到另一个应用程序吗

nginx-rtmp从一个应用程序推送到另一个应用程序

我正在开发一个测验应用程序。我想知道如何在不使用构造函数的情况下将 score 变量传递到另一个页面

html - 如何在没有任何数据库的情况下将数据从一个页面传输到另一个页面?

仅将一些提交推送到另一个git存储库

如何将本地存储库指定为另一个本地存储库的远程存储库?

如何在没有位置的情况下将一个div与另一个div重叠

如何在不安装的情况下从一个应用程序启动另一个应用程序

有没有一种方法可以在不使A为库模块的情况下将模块A导入另一个模块B中?在android studio中

我可以将本地存储库推送到两个远程存储库吗?

如何在不添加远程的情况下将提交推送到 git 存储库?

将代码从存储库的一个分支推送到另一个存储库的另一个分支

无法将文件从一个应用程序导入到另一个

如何将 Intent 从我的一个应用程序发送到我的另一个应用程序?