模块依赖性问题共同开发了两个单独的go模块

如何解决模块依赖性问题共同开发了两个单独的go模块

我正在创建一个small utility,我们将其称为 A ,为此,我需要对另一个go project进行一些小的更改,将其称为 B

首先,我将 B 分叉到B_forked中,并创建了所需的PR。作者尚未审查它,这很好,不要着急。

但是我暂时暂时不使用 A 使用我的版本 B_forked 。除此以外,我还希望能够共同开发两个文件(编辑文件并使它们相互更改),而不是将 A 粘贴到 B / B_forked )。

因此,我编辑了 A 以导入 B_forked ,并在我的~/Projects/A/go.mod中写了以下内容:

module A

go 1.15

require (
    ... # Other packages
)

replace B_forked => ../B_forked

然后在 B_forked 中,输入以下~/Projects/B_forked/go.mod(版本号由go自动生成):

module B_forked

go 1.15

require (
    B v0.0.0-00010101000000-000000000000
    ... # Other packages
)

replace B => ./

在我的 B_forked 版本中,我不想用import B/...替换代码中的所有import B_forked/...(因为我希望将更改包含在PR中,以 B )。这就是为什么我在这里使用replace规则的原因。

以某种方式这是行不通的,我不知道为什么。构建 B_forked 似乎可行:

$ cd ~/Projects/B_forked
$ go build
$

但是当我尝试编译 A 时,我得到了:

$ cd ~/Projects/A
$ go build

go: found github.com/janpfeifer/webcam in github.com/janpfeifer/webcam v0.0.0-00010101000000-000000000000
go: github.com/janpfeifer/webcam@v0.0.0-00010101000000-000000000000 requires
        github.com/blackjack/webcam@v0.0.0-00010101000000-000000000000: invalid version: unknown revision 000000000000
  • janpfeifer/webcam == B_forked
  • blackjack/webcam == B
  • 当我构建 B_forked
  • 时,go自己选择了 B 的版本号blackjack/webcam

我可能会误解go模块的底层抽象(到目前为止,我在模块上花费的时间比在简单代码本身上花费的时间要多得多)。任何想法如何设置?也许有一种我不知道的更简单的滚动方式?

非常感谢!

解决方法

在阅读了答案和评论(@ kostix,@ volker)并进行了实验之后,在我看来,最有效的方法是:

B 叉入 B_forked ,并在 B_forked 中有2个分支:

  • 在分支 b1 中,我用来创建github的PR。

  • 在分支 b2 中,我将所有 B 的自导入内容更改为 B_forked 。之后,我使用 b2 A 共同开发。我git cherry-pick将更改提交回分支 b1

A 中,我导入了 B_forked ,然后在go.mod上将版本设置为 b2 分支的HEAD,因此可以由其他人构建,而PR不在存储库 B 中。

在开发过程中,我在 A go.mod中将 replace 规则从 B_forked 添加到其本地磁盘目录中,因此进行了更改在 A 中会立即看到 B_forked 中的内容。

进入PR到 B 后,我会将 A 的导入更改回 B

,

如果您“分叉”包含Go软件包或Go模块的存储库,则您将创建与原始版本完全不相关的内容。根据详细信息,您甚至可能无法编译“ fork”(甚至是未修改的“ fork”),并且“ fork”可能无法工作。

经验法则:从不派生Go包或Go模块。

在我的B_forked版本中,我不想将代码中的所有导入B / ...替换为import B_forked /...

必须,如上所述。 B_forked与B完全无关。您必须重写所有导入或为所有导入添加replace指令。这里必须仔细选择“必须”一词:您真的必须,这里没有欺骗或聪明的地方,特别是

这就是为什么我在这里使用替换规则。

不起作用。那根本不是Go模块(或包)如何工作的。模块的标识基于模块名称和程序包在其导入路径上的身份(该路径以其包含的模块名称为前缀)。

主要问题来自“分叉”。只是不要那样做!您无法在叉车上可靠,方便地工作。没门。没有替换指令魔术会有所帮助。你一定不能分叉。

改为执行简单的git clone。这样,您可以获得模块/软件包的正确副本。处理该克隆。向您的项目A添加替换指令,该指令指向您的本地克隆(不是“ fork”!)。像这样,B仍可以正确构建,不需要替换魔术或导入路径重写,并且A会获取您在本地修改的B副本。

因为我希望以后将更改包含在对B的PR中

好的。对于Github-PR,您需要一个fork,但是此fork仅需要存在于Github上。 请执行以下操作:

  1. 您已经克隆了B并进行了工作。保留那个。
  2. Github GUI中的叉子B。
  3. 将该派生添加为克隆的附加远程对象。
  4. 要创建PR,请执行以下操作:从克隆副本推送到其他远程fork并创建PR。
  5. 从不尝试编译“ fork”。 “叉子”仅存在于Github上以进行PR。您所有的工作都是在B的实际代码上完成的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res