我们有2个解决方案。
SolutionA
是一种内部解决方案,我们在产品中放置了可重用的代码
出于问题的考虑,它只有两个项目NugetProjectA
和NugetProjectB
到project reference
之间有一个NugetProjectA
。
SolutionB
是一种通过nuget对package references
的{{1}}的解决方案。
麻烦的是:
SolutionA
中添加的新方法NugetProjectA
项目中使用先前方法添加新方法NugetProjectB
的新版本NugetProjectB
的{{1}}上更新nuget引用Project
新添加的SolutionA
方法中执行由于我们没有发布Project
更新版本,因此描述的最后一步将失败。
这似乎是一个容易解决的问题。但请想象一下,NugetProjectB
中还有更多项目,NugetProjectA
中还有更多项目。
答案 0 :(得分:0)
您的问题含糊且不限成员名额,因此没有简单明了的答案。老实说,它很容易成为多篇博文系列,甚至是一本简短的书。我将尝试给出一些一般性建议,但为了避免回答太长,我将不做详细介绍。
就像几年前的微服务热潮一样,您首先应该问自己是否需要它。将所有源代码都放在一个存储库和解决方案中可能会让您感到“过时”,并且当检查1行内容时,将组件构建3分钟而不是构建整个系统30分钟似乎更好。错误修复。但是,您在问题中列出的问题是否值得通过缩短CI配置来获得好处?
另一个极端是,Google可能将几乎所有内容都运行在单个存储库中,但他们的团队成员除了管理单一仓库和构建系统外,无所不用其极,因为从事单个仓库的大量开发人员都拥有一系列不同的问题。这些工程师不在客户应用程序上工作。如果他们的工作使其他团队更具生产力,那么这是值得的。
您需要找出最适合您的方法,但是鉴于您在问题中描述的问题,也许您有太多的回购/解决方案,并且如果您进行少量合并,您的流程可能会更快,出错更少。
下一个最好的事情就是仅使用良好的工程实践。尽可能地自动化,以减少人为错误的风险,包括自动化流程以验证手动流程的正确执行。
但是要对自动化实现实用。花费一个星期的全职时间来自动化某件事是没有意义的,每月只需花费5分钟一次即可进行手动操作。但是,如果手动流程有时会出错并且需要花费数小时或数天的时间进行修复,那么使流程自动化将更值得。
自宣布.NET Core以来,过去2-3年中.NET生态系统发生了很大变化。现在,使用MSBuild(dotnet pack
或msbuild -t:pack
)打包比创建.nuspec
文件更容易创建软件包,并确保您做正确的事情来将项目依赖项打包为nuget依赖项,并获得所有文件放置在正确的位置,等等。如果您的类库使用SDK样式的项目,则无需执行其他任何操作。如果您的项目是传统项目,则需要对NuGet依赖项使用PackageReference
(或在项目文件中将<ProjectStyle>PackageReference</ProjectStyle>
指定为MSBuild属性),然后引用NuGet.Build.Tasks.Pack
包。
就像单仓库还是多个仓库一样,请考虑使用单个版本号对应用程序中的所有软件包进行版本控制,而不是分别对每个软件包进行版本控制。是的,这意味着您有时(或可能经常)发布一个软件包的新版本,该软件包的旧版本没有任何代码更改,但是极大地简化了发行版。结合以上部分中的MSBuild打包功能,您可以在系统信息库根目录中创建一个Directory.Build.props
文件,并将<Version>
属性设置为您的应用版本,并且该存储库中的所有项目都将具有相同的版本。因此,当您准备发布时,将版本捆绑在一个文件中,每个项目和每个NuGet软件包都将具有相同的版本。
在理想情况下,每个组件都可以在单独的源代码存储库中的不同应用程序中重用,每个包都使用语义版本控制进行单独版本控制。但是在现实世界中,这增加了很多开发时间的复杂性。您的客户可能会更乐于更快地获得错误修复和新功能,即使软件包的版本号意义不大。因此,做出以数据为依据的决策。如果您经常遇到依赖性版本问题,请减少依赖性,以减少出错的地方。
不要误会我的意思,有很多充分的理由来拥有多个项目,多个解决方案和多个存储库。只需确定您这样做的原因是因为它可以帮助您的团队/公司提高生产力,而不是出于理想主义的原因(这会减慢您的速度或导致错误)。