如何在基于 nuget 的架构中正确引用库
How to properly reference a library in nuget-based architecture
我正在尝试创建几个供公司内部使用的 nuget 包:
OurCompany.Infrastructure.Logging.Interfaces
和 OurCompany.Infrastructure.Logging
.
所以我在同一个解决方案中创建了两个 class 库项目,为 OurCompany.Infrastructure.Logging.Interfaces
提供了一个实现并创建了一个包。
现在我有一个问题:如何在OurCompany.Infrastructure.Logging
项目中正确引用OurCompany.Infrastructure.Logging.Interfaces
库?
我应该将其添加为 nuget 包还是仅添加为项目引用?
没有完美的解决方案。
当您使用 NuGet 包但在使用它的应用程序上工作时需要在库中进行更改时,您需要在库中进行更改、发布包的新版本、更新您的参考在您的应用程序中,然后希望您在库中所做的更改按需要工作。特别是在处理新功能时,这是非常缓慢的,因为您的软件设计通常会在您开始到完成之间多次更改,并且调试更加困难。如果您的公司没有工具来检查更新并提醒团队更新可用,那么您可能会陷入碎片化的境地,一些团队仍在使用非常旧版本的库,如果他们尝试升级他们的应用程序中断并需要额外的时间来适应 shaed 库中的重大变化。
另一方面,如果您使用项目引用,调试和实现新功能会更容易,并且会立即检测到重大更改,假设您有足够的自动化测试,但它要求所有代码都在同一个存储库中,或者看起来像它(可能使用 git 子模块,或者有一个约定,其中多个 repos 总是在相同的相对路径中克隆)。
Google 和 Microsoft 都必须实施自己的源代码控制系统工具来处理对于单个开发人员机器来说太大而无法使用的大量存储库,并加快开发箱和软件的编译时间在 CI 个代理上,因为您不希望更改一个应用程序中的 1 行代码导致公司重建和测试每个应用程序。但是除非贵公司希望让工程师专注于构建系统而不是为客户应用程序做贡献,否则这是不可行的。
因此,具有相对路径约定的子模块或 multiple-repos 听起来很吸引人,但它仍然需要在每个使用该库的 CI 构建时重新编译该库。没什么大不了的,但是如果更改共享库的频率非常低,那么让库的代码更改变得容易就没有什么好处了。另外当其他人更新库时,你怎么知道你需要更新子模块? NuGet 工具可能更适合检查更新和实际更新。
就个人而言,我总是对已经在同一解决方案中的项目使用项目引用,对其他所有项目使用 nuget 引用。我过去所做的是,当我需要修复错误或向打包的库添加新功能时,我克隆两个 repos 端,临时将库的项目添加到我的应用程序的解决方案并将 nuget 引用更改为项目参考。然后我开发就好像它们都在一个回购协议中一样。最后,我需要在签入之前手动撤消 solution/project 引用更改并增加包引用版本号。由于它是手动的,因此有时会出错。但这是我迄今为止找到的最佳平衡点。您需要决定什么最适合您自己的情况。
最好的解决办法是:两者兼顾!
使用 Choose 指令,您可以设置条件引用:
<Choose>
<When Condition="'$(Configuration)'=='Debug'">
<ItemGroup>
<ProjectReference Include="Path\To\Your.Awesome.Package.csproj" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<PackageReference Include="Your.Awesome.Package" Version="1.0.0" />
</ItemGroup>
</Otherwise>
</Choose>
在此示例中,您的项目将在 运行 调试模式下使用直接项目引用,然后,其余时间将使用 NuGet 包引用。
即使您仍然负责维护正确的 NuGet 包版本,但没有什么是完美的。
我希望这会对某人有所帮助。
我正在尝试创建几个供公司内部使用的 nuget 包:
OurCompany.Infrastructure.Logging.Interfaces
和 OurCompany.Infrastructure.Logging
.
所以我在同一个解决方案中创建了两个 class 库项目,为 OurCompany.Infrastructure.Logging.Interfaces
提供了一个实现并创建了一个包。
现在我有一个问题:如何在OurCompany.Infrastructure.Logging
项目中正确引用OurCompany.Infrastructure.Logging.Interfaces
库?
我应该将其添加为 nuget 包还是仅添加为项目引用?
没有完美的解决方案。
当您使用 NuGet 包但在使用它的应用程序上工作时需要在库中进行更改时,您需要在库中进行更改、发布包的新版本、更新您的参考在您的应用程序中,然后希望您在库中所做的更改按需要工作。特别是在处理新功能时,这是非常缓慢的,因为您的软件设计通常会在您开始到完成之间多次更改,并且调试更加困难。如果您的公司没有工具来检查更新并提醒团队更新可用,那么您可能会陷入碎片化的境地,一些团队仍在使用非常旧版本的库,如果他们尝试升级他们的应用程序中断并需要额外的时间来适应 shaed 库中的重大变化。
另一方面,如果您使用项目引用,调试和实现新功能会更容易,并且会立即检测到重大更改,假设您有足够的自动化测试,但它要求所有代码都在同一个存储库中,或者看起来像它(可能使用 git 子模块,或者有一个约定,其中多个 repos 总是在相同的相对路径中克隆)。
Google 和 Microsoft 都必须实施自己的源代码控制系统工具来处理对于单个开发人员机器来说太大而无法使用的大量存储库,并加快开发箱和软件的编译时间在 CI 个代理上,因为您不希望更改一个应用程序中的 1 行代码导致公司重建和测试每个应用程序。但是除非贵公司希望让工程师专注于构建系统而不是为客户应用程序做贡献,否则这是不可行的。
因此,具有相对路径约定的子模块或 multiple-repos 听起来很吸引人,但它仍然需要在每个使用该库的 CI 构建时重新编译该库。没什么大不了的,但是如果更改共享库的频率非常低,那么让库的代码更改变得容易就没有什么好处了。另外当其他人更新库时,你怎么知道你需要更新子模块? NuGet 工具可能更适合检查更新和实际更新。
就个人而言,我总是对已经在同一解决方案中的项目使用项目引用,对其他所有项目使用 nuget 引用。我过去所做的是,当我需要修复错误或向打包的库添加新功能时,我克隆两个 repos 端,临时将库的项目添加到我的应用程序的解决方案并将 nuget 引用更改为项目参考。然后我开发就好像它们都在一个回购协议中一样。最后,我需要在签入之前手动撤消 solution/project 引用更改并增加包引用版本号。由于它是手动的,因此有时会出错。但这是我迄今为止找到的最佳平衡点。您需要决定什么最适合您自己的情况。
最好的解决办法是:两者兼顾!
使用 Choose 指令,您可以设置条件引用:
<Choose>
<When Condition="'$(Configuration)'=='Debug'">
<ItemGroup>
<ProjectReference Include="Path\To\Your.Awesome.Package.csproj" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<PackageReference Include="Your.Awesome.Package" Version="1.0.0" />
</ItemGroup>
</Otherwise>
</Choose>
在此示例中,您的项目将在 运行 调试模式下使用直接项目引用,然后,其余时间将使用 NuGet 包引用。
即使您仍然负责维护正确的 NuGet 包版本,但没有什么是完美的。
我希望这会对某人有所帮助。