dha*_*ech 5 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才能看到更改。通过 pre-nuget 安排,我只需构建B,A就会看到更改。
另一种方法是在进行本地开发时删除A对B的 nuget 包的引用并恢复为指向本地 DLL。但是,如果A发布到 github,则在推送到 github 之前必须将引用恢复为 nuget 引用。
在这种情况下,最佳做法是什么?当然,随着 github 和 nuget 的广泛使用,很多人都在处理这类事情。
更新
这个主题在 C# subreddit 上进行了讨论,并指出了一些有趣的方法。
我们所做的是使用 azure devops ( https://azure.microsoft.com/en-us/services/devops/ ) 在新提交后自动构建并推送我们的 nuget 包到我们自己的存储库(nuget.org 很慢)已被推。
你设置一次,推动项目 B 喝点咖啡,享受更新包的乐趣。
你提到了 GitHub,所以我会提出一些不同的建议:
在我看来,如果项目 A 的工作可能会导致项目 B 的更改,那么 A 将 B 引用为 git 子模块比处理 nuget 容易得多。Git 子模块并非没有令人头痛的问题,但这就是它们的设计目的。一些好处:
1)最大的问题是,如果你说“如果我需要更改 B,那么我只需进行更改并推动构建一个新包,然后在 A 中测试它”,这不是一个非常流畅的模型,而且它是要求开发人员将未经测试的代码推送到 B 中。然后 CI 构建/打包的 1-3 分钟周转变成了 3 x 1-3 分钟周转,当我过去尝试过时,感觉很糟糕。这是生产力的巨大杀手。
2)有关更改 csproj 文件的任何其他选项,它们都可以工作,但很容易出错。开发人员并不总是擅长在提交之前审查所有更改,开发人员可能会忘记并签入对项目引用的更改,这将导致构建失败。
3)使用 B 作为 A 的子模块并不会阻止您在 B 上自动构建生成 nuget 包,也许其他不太可能更改 B 的项目可以/应该引用这些项目
4)在A开发的某个时刻,如果它成熟并且变得不太可能引起B的变化,那么您也可以将A->B切换为nuget包引用
另一种选择,我记得几年前读过一篇文章,其中有人创建了一个生成 msbuild xproj 文件的工具,该文件将用项目引用替换包引用。他们将其设置在 .gitignore 上 xproj 文件所在的位置,如果该文件不存在,则使用 nuget 包引用。通过这种方式,开发人员可以运行命令来切换到项目引用,进行所需的更改,提交更改,推送更改,然后更新 nuget 引用。这对我来说似乎相当干净,但我找不到这篇文章,而且它比我听起来的要复杂一些。
所以我仍然会选择 git 子模块路线。git 子模块有一些怪癖,但在过去几年里它们变得更容易处理,而且感觉这些怪癖比其他选项更容易解释。现在已经在几个项目中使用过它,它非常直观。了解什么是处于分离头状态的 Git 子模块以及如何避免它,确保在添加子模块时使用 -b 选项,并找到一个可以很好地处理子模块的好工具。就其价值而言,VS Code 是我发现的用于处理子模块的最直观的界面。在 VS Code 中打开 A,然后切换到版本控制选项卡,您将看到 A 和顶部列出的任何子模块以及它们正在跟踪的分支。将更改提交到子模块,然后提交到父模块,就可以了。
如果您使用的是 Visual Studio 2017,则可以安装Visual Studio 2017扩展的 NuGet 参考切换器。以下是如何使用它的指南: https: //github.com/RicoSuter/NuGetReferenceSwitcher/wiki/Guide