假设我有项目 A 和项目 B 。项目 A 取决于项目 B 。因此, A 通常会直接引用 B 的DLL。
然后我决定发布 B 作为nuget程序包。现在, A 通过nuget而不是本地DLL引用了 B 。
这种安排的缺点是,如果我更新 B ,我需要上传一个新的nuget并等待它可用,以便从 A 中使用它。
我看到在更新 A 对 B 的引用时,我可以指向本地nuget包,这确实有所帮助。但是,如果我对 B 进行了更改,则仍然必须经历生成新程序包并在之前更新 A 对程序包的引用的步骤。 > A 将看到更改。通过预先的安排,我简单地构建了 B 和 A 即可看到更改。
另一种选择是删除 A 对 B 的nuget包的引用,并在进行本地开发时恢复为指向本地DLL。但是,如果 A 发布到github,则在推送到github之前,该引用必须还原为nuget引用。
在这种情况下,最佳做法是什么?当然,许多人正在使用github和nuget来处理这种事情。
更新
在C#subreddit上,discussion提出了这个主题,并指出了一些有趣的方法。
我们要做的是使用天蓝色devops( https://azure.microsoft.com/en-us/services/devops/)进行构建和推送 我们的nuget包到我们自己的存储库中(nuget.org很慢) 在推送新的提交后自动完成。
设置一次,推动项目B喝点咖啡,享受欢乐 正在更新软件包。
您提到GitHub,所以我会提出一些不同的建议:
我认为,如果项目A的工作可能会导致 项目B,将B引用为git子模块要容易得多 处理nuget。 Git子模块并非没有头痛,但 这就是他们的目的。一些好处:
1)最大的问题是,如果您说“如果我需要更改B,那么我会 只需进行更改并推动以构建新的软件包,然后对其进行测试 在A中列出”,这不是一个非常流畅的模型,它要求 开发人员将未经测试的代码推送到B中。然后旋转1-3分钟 CI构建/打包的时间大约为3 x 1-3分钟 我过去尝试过时感觉很恐怖。这是一个巨大的 生产力杀手。
2)关于更改csproj文件的任何其他选项,它们都可以使用,但是 他们很容易出错。开发人员并非总是擅长于 在提交更改之前先检查所有更改,您将拥有 开发人员忘记并签入项目变更 参考,这会导致构建失败。
3)将B用作A的子模块不会阻止您 在B上自动生成可生成nuget包的程序 不太可能更改B的项目可以/应该引用那些
4)在A的发展过程中,如果它成熟并变成 不太可能导致B发生变化,那么您可以将A-> B切换到nuget 包参考也
另一种选择,我记得几年前读过一篇文章 已经创建了一个生成msbuild xproj文件的工具,该文件将 用项目引用替换包引用。他们设置好了 xproj文件位于.gitignore上的位置,如果文件没有 存在时,使用了nuget包引用。这样,开发人员 将运行命令以切换到项目引用,使 他们需要的更改,提交它们,推送更改,然后更新nuget 参考。这对我来说似乎很干净,但是我找不到 文章,而且比我讲的还复杂。
所以我仍然会继续使用git子模块路由。有一些怪癖 使用git子模块,但是它们变得更容易处理了 最近几年,感觉古怪更容易 解释比其他选择。在一些项目中使用过 现在,这非常直观。了解什么是Git子模块 分离头状态是以及如何避免它,请确保使用-b 添加子模块时选择选项,并找到一个可以 处理好子模块。就其价值而言,VS Code是最重要的 我发现了用于子模块的直观界面。在打开 VS Code,然后切换到版本控制标签,您会看到A和 列出的所有子模块以及它们正在跟踪的分支。 将更改提交到子模块,然后提交到父模块,您很高兴 去。
答案 0 :(得分:2)
如果您使用的是Visual Studio 2017,则可以安装NuGet Reference Switcher for Visual Studio 2017扩展名。以下是使用方法的指南:https://github.com/RicoSuter/NuGetReferenceSwitcher/wiki/Guide
答案 1 :(得分:1)
Node社区展示了一种更强大的方法。即用即用的 npm link 命令(另请参见this blog post)创建从分布式软件包目录到软件包源目录的符号链接。通过这种方式:
与参考切换相比,document.getElementById("newUser").addEventListener("click", function(event) {
let element = event.target;
let parent = element.parentNode;
parent.removeChild(element);
//Next line is wrong since getElementById is a function and should take args
//document.getElementById.style.display="block";
});
方法还具有以下优点:
NuGet社区显然需要此功能,但是由于某些原因,NuGet仍然缺少此功能。有一个功能请求https://github.com/NuGet/Home/issues/1821,表明他们没有计划添加它。
与此同时,我创建了一个工具,该工具的作用与 npm链接类似,适用于NuGet软件包,但您可以尝试一下:https://www.nuget.org/packages/NuLink