也许我在这里挑战极限,但我迫切希望利用 NuGet 来缓解我发现自己陷入的 DLL 地狱。
我们有 4 种主要产品,它们都存在于相互关联的 Mercurial 存储库中。他们所有人都“共享”了 3 个核心组件,然后其他所有内容都几乎是特定于产品的。现在管理起来变得非常困难,因为一个产品已经升级到 .NET 4.0 并且正在使用需要 .NET 4.0 的外部依赖项,而另一个产品由于我什至不想进入的原因被困在 .NET 3.5 中。
因此,我们失去了融合产品之间差异的能力。
为了修复它,我想取出 3 个主要程序集,并将它们变成具有自己发布周期的自己的项目,并注意确保它们可以针对 .NET 3.5 和 4.0 进行编译,然后将它们变成包含多个框架版本的 NuGet 包。
但是,我也希望开发人员能够浏览这些项目的来源。
所以我设置了一个私有 NuGet 服务器和一个私有 SymbolSource 服务器。然后我小心地将所有存储库中的所有更改合并在一起,并丢弃了除我的核心程序集之外的所有内容。然后我煞费苦心地手工编辑了 .csproj 文件,以便每个项目都有 3.5 和 4.0 的平台目标而不是 AnyCPU 平台,它们指定条件常量(用于控制特定于平台的功能,如 System.Dynamic)并设置框架版本。
然后我为“3.5 Debug”、“3.5 Release”、“4.0 Debug”和“4.0 Release”设置了解决方案配置。每一个都针对适当的配置(调试或发布)和平台(3.5 或 4.0)。
我可以在 Visual Studio 中为任何平台构建一切正常的东西。现在我在谈到 NuGet 时遇到了一个问题,因为有两种方法可以创建一个包,并且都有一个弱点,除非我遗漏了一些东西:
按项目文件打包
nuget pack MyProject.csproj -Build -Symbols -Version <insert-from-build-server> -Properties "Configuration=Release;Platform=3.5;"
这样做的问题是:
- 在构建和打包 3.5 版本时,输出显示“为目标框架 '.NETFramework,Version=v4.0' 构建项目”。
- 如果我解压缩生成的包,则程序集所在的位置
lib\net40
是错误的。 - 我不认为有任何方法可以以这种方式打包 2 个框架目标,您必须以另一种方式使用文件夹和约定。
- 我愿意接受您不能将框架打包在一起并制作 2 个名为 MyProject(我会做为 4.0)和 MyProject.V35 的包......但是我不知道如何拥有相同的项目和 nuspec并以不同的 id 结束 2 个不同的结果。
按 Nuspec 文件打包
使用这种方法,我必须自己完成所有的 msbuilding,然后进行一堆文件复制来设置文件夹结构,例如
* MyProject.nuspec
* net40
* MyProject.dll
* MyProject.pdb
* net35
* MyProject.dll
* MyProject.pdb
然后我可以运行nuget pack MyProject.nuspec
,但是没有与符号一起使用的源,因为没有 .csproj 文件,NuGet 无法确定从哪里获取所有源文件,而且我没有看到任何有关如何操作的文档这也使用目录约定。
所以我的问题是:
- 有没有办法将源文件添加到基于约定的包中?
- 有没有办法用不同的 id 将基于项目的包打包两次?
- 还有其他可能我没有考虑过的途径吗?
任何想法将不胜感激。