【发布时间】:2012-10-12 21:41:45
【问题描述】:
也许我在这里挑战极限,但我迫切希望利用 NuGet 来缓解我陷入的 DLL 地狱。
我们有 4 种主要产品,它们都存在于相互关联的 Mercurial 存储库中。他们所有人都“共享”了 3 个核心组件,然后其他所有内容都几乎是特定于产品的。现在变得非常难以管理,因为一个产品已经升级到 .NET 4.0 并且正在使用需要 .NET 4.0 的外部依赖项,而另一种产品由于我什至不想进入的原因被困在 .NET 3.5 中。
因此,我们已经失去了合并产品之间差异的能力。
要修复它,我想取出 3 个主要程序集,并将它们变成具有自己发布周期的自己的项目,并注意确保它们可以针对 .NET 3.5 和 4.0 进行编译,然后将它们转换为包含多个框架版本的 NuGet 包。
但是,我还希望开发人员能够浏览这些项目的源代码。
所以我设置了一个private NuGet server 和一个private SymbolSource server。然后我小心地将所有存储库中的所有更改合并在一起,并丢弃了除了我的核心程序集之外的所有内容。然后我煞费苦心地手工编辑了 .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 版本时,输出显示“Building project for target framework '.NETFramework,Version=v4.0'。”
- 如果我解压生成的包,程序集在
lib\net40下,这是错误的。 - 我认为没有办法以这种方式打包 2 个框架目标,您必须使用文件夹和约定以另一种方式进行打包。
- 我愿意接受您不能将框架打包在一起并制作 2 个名为 MyProject(我将作为 4.0 执行)和 MyProject.V35 的包......但是我不知道如何拥有相同的project 和 nuspec 并以不同的 id 得到 2 个不同的结果。
按 Nuspec 文件打包
用这种方法,我必须自己做所有的msbuilding,然后做一堆文件复制来设置一个文件夹结构,比如
* MyProject.nuspec
* net40
* MyProject.dll
* MyProject.pdb
* net35
* MyProject.dll
* MyProject.pdb
然后我可以运行nuget pack MyProject.nuspec,但是没有与符号一起使用的源,因为没有 .csproj 文件,NuGet 无法弄清楚从哪里获取所有源文件,而且我看不到任何有关如何使用目录约定执行此操作的文档。
所以我的问题是:
- 有没有办法将源文件添加到基于约定的包中?
- 有没有办法将基于项目的包以不同的 id 打包两次?
- 还有其他可能我没有考虑过的途径吗?
任何想法将不胜感激。
【问题讨论】:
-
我所有的赞成票 - 拿走他们!拿走他们!
标签: nuget nuget-package multiplatform