具有相关项目的本地开发nuget

时间:2019-05-01 07:33:24

标签: c# visual-studio nuget

假设我有项目 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提出了这个主题,并指出了一些有趣的方法。

Azure devops-original comment - thanks to B0dona

  

我们要做的是使用天蓝色devops(   https://azure.microsoft.com/en-us/services/devops/)进行构建和推送   我们的nuget包到我们自己的存储库中(nuget.org很慢)   在推送新的提交后自动完成。

     

设置一次,推动项目B喝点咖啡,享受欢乐   正在更新软件包。

git子模块-original comment - thanks to alkrun

  

您提到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和   列出的所有子模块以及它们正在跟踪的分支。   将更改提交到子模块,然后提交到父模块,您很高兴   去。

2 个答案:

答案 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"; }); 方法还具有以下优点:

  • 未对消费者的源代码进行任何更改-可能会意外提交。
  • 可以跨平台工作,不需要特定的IDE
  • 可以编写脚本并与团队共享

NuGet社区显然需要此功能,但是由于某些原因,NuGet仍然缺少此功能。有一个功能请求https://github.com/NuGet/Home/issues/1821,表明他们没有计划添加它。

与此同时,我创建了一个工具,该工具的作用与 npm链接类似,适用于NuGet软件包,但您可以尝试一下:https://www.nuget.org/packages/NuLink