管理存在于多个解决方案中的 C# 项目的 Nuget 包
Managing Nuget packages for C# project present in multiple solutions
我现在正处于一个大项目的疯狂重构阶段,其中有很多遗留和不稳定的模块。我决定 拆分解决方案 ,目前所有项目(大约 20 个,而且还会有更多,因为单元测试项目肯定会在下个月出现)链接在其中以制作它更加独立和细化。
使用这种方法有模块,例如API 个需要在多个解决方案中引用或添加的客户端。
问题是 Nuget 包只能在最初首次添加的解决方案上恢复。所以最简单的例子:
解决方案 A:
------ 项目A
------ API客户端
解决方案 B:
------ 项目B
------ API客户端
由于我们不包括 packages 文件夹,它会导致 Nuget 包出现问题:
克隆存储库。
打开解决方案 B,构建它并恢复解决方案的 Nugets。
解决方案 B 中客户端 API 的包错误。
转到解决方案 A 构建它并恢复解决方案的 Nugets
返回解决方案 B。
在解决方案 B 中为客户端API 恢复了 Nuget,错误消失了。
有什么办法吗:
- 使项目对每个解决方案使用不同的路径?
- 也许在构建中链接解决方案以使解决方案 A 始终与解决方案 B 一起构建?但这听起来像是失去了将这一大解决方案拆分为较小解决方案的一些好处。
- 使用任何其他方法使它更细化,但不会因为需要重建所有内容而遇到问题?我听说过私人 Nuget 提要,如果我的配置允许的话,这会是这个问题的答案吗?
我的配置:
- VCS:带有 TFVC 的 TFS
- IDE: Visual Studio 专业 2017
- 默认包管理格式:Packages.config
为什么不在方案B中添加包?
你用的是什么打包模式?
如果使用"Package reference"模式,必须在方案B的csproj中添加包信息
如果使用"Package config"模式,必须在方案B的package.config文件中添加包信息。
Managing Nuget packages for C# project present in multiple solutions
感谢您的回复。我用两个解决方案重现了这个问题,SolutionA
和项目 APIClient
。并且SolutionB
,将SolutionA
中已有的项目APIClient
添加到SolutionB
.
那么如果我们恢复SolutionB
上的nuget包,SolutionB中项目APIClient
中的包将恢复到中的\packages
文件夹中默认情况下,SolutionB 文件夹而不是 SolutionA
文件夹。
在这种情况下,项目 APIClient
仍然缺少 SolutionB
中的 .dll
引用,您仍然必须转到 SolutionA
并恢复 nuget 包。这就是您遇到该问题的原因。
要解决此问题,您可以在 SolutionA
和 SolutionB
旁边添加一个 NuGet.Config
文件,其中包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="C:\Packages" />
</config>
</configuration>
因此,\packages
文件夹与解决方案文件无关。
此外,如果你有兴趣,你可以尝试将项目APIClient
的packages.config
转换为packagereference
,使用此设置,nuget包将保存在全局包文件夹,C:\Users\<UserName>\.nuget\packages
。
希望这对您有所帮助。
我现在正处于一个大项目的疯狂重构阶段,其中有很多遗留和不稳定的模块。我决定 拆分解决方案 ,目前所有项目(大约 20 个,而且还会有更多,因为单元测试项目肯定会在下个月出现)链接在其中以制作它更加独立和细化。
使用这种方法有模块,例如API 个需要在多个解决方案中引用或添加的客户端。
问题是 Nuget 包只能在最初首次添加的解决方案上恢复。所以最简单的例子:
解决方案 A:
------ 项目A
------ API客户端
解决方案 B:
------ 项目B
------ API客户端
由于我们不包括 packages 文件夹,它会导致 Nuget 包出现问题:
克隆存储库。
打开解决方案 B,构建它并恢复解决方案的 Nugets。
解决方案 B 中客户端 API 的包错误。
转到解决方案 A 构建它并恢复解决方案的 Nugets
返回解决方案 B。
在解决方案 B 中为客户端API 恢复了 Nuget,错误消失了。
有什么办法吗:
- 使项目对每个解决方案使用不同的路径?
- 也许在构建中链接解决方案以使解决方案 A 始终与解决方案 B 一起构建?但这听起来像是失去了将这一大解决方案拆分为较小解决方案的一些好处。
- 使用任何其他方法使它更细化,但不会因为需要重建所有内容而遇到问题?我听说过私人 Nuget 提要,如果我的配置允许的话,这会是这个问题的答案吗?
我的配置:
- VCS:带有 TFVC 的 TFS
- IDE: Visual Studio 专业 2017
- 默认包管理格式:Packages.config
为什么不在方案B中添加包?
你用的是什么打包模式?
如果使用"Package reference"模式,必须在方案B的csproj中添加包信息
如果使用"Package config"模式,必须在方案B的package.config文件中添加包信息。
Managing Nuget packages for C# project present in multiple solutions
感谢您的回复。我用两个解决方案重现了这个问题,SolutionA
和项目 APIClient
。并且SolutionB
,将SolutionA
中已有的项目APIClient
添加到SolutionB
.
那么如果我们恢复SolutionB
上的nuget包,SolutionB中项目APIClient
中的包将恢复到中的\packages
文件夹中默认情况下,SolutionB 文件夹而不是 SolutionA
文件夹。
在这种情况下,项目 APIClient
仍然缺少 SolutionB
中的 .dll
引用,您仍然必须转到 SolutionA
并恢复 nuget 包。这就是您遇到该问题的原因。
要解决此问题,您可以在 SolutionA
和 SolutionB
旁边添加一个 NuGet.Config
文件,其中包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="C:\Packages" />
</config>
</configuration>
因此,\packages
文件夹与解决方案文件无关。
此外,如果你有兴趣,你可以尝试将项目APIClient
的packages.config
转换为packagereference
,使用此设置,nuget包将保存在全局包文件夹,C:\Users\<UserName>\.nuget\packages
。
希望这对您有所帮助。