gpt4 book ai didi

nuget - 使用用于内部依赖管理的符号进行多框架 NuGet 构建

转载 作者:行者123 更新时间:2023-12-02 18:03:59 25 4
gpt4 key购买 nike

也许我在这里挑战了极限,但我迫切希望利用 NuGet 来缓解我所陷入的 DLL hell 。

我们有 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 调试”、“3.5 发布”、“4.0 调试”和“4.0 发布”的解决方案配置。每一个都针对适当的配置(调试或发布)和平台(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 projecct for target Framework '.NETFramework,Version=v4.0'。”
  • 如果我解压生成的包,程序集位于 lib\net40 下,这是错误的。
  • 我认为没有任何方法可以通过这种方式打包 2 个框架目标,您必须使用文件夹和约定以其他方式进行操作。
  • 我愿意接受您无法将框架打包在一起并制作两个名为 MyProject(我将其作为 4.0)和 MyProject.V35 的包...但是我不知道如何拥有相同的包项目和 nuspec 最终得到 2 个具有不同 id 的不同结果。

Nuspec 文件打包

使用这种方法,我必须自己完成所有的 msbuilding,然后进行大量文件复制来设置像这样的文件夹结构

* MyProject.nuspec
* net40
* MyProject.dll
* MyProject.pdb
* net35
* MyProject.dll
* MyProject.pdb

然后我可以运行 nuget pack MyProject.nuspec 但随后没有与符号一起使用的源代码,因为没有 .csproj 文件,NuGet 无法弄清楚从哪里获取所有符号源文件,而且我也没有看到任何有关如何使用目录约定执行此操作的文档。

所以我的问题是:

  1. 有没有办法将源文件添加到基于约定的包中?
  2. 有没有办法使用不同的 id 将基于项目的包打包两次?
  3. 还有其他我可能没有考虑过的途径吗?

如有任何想法,我们将不胜感激。

最佳答案

Xavier 的回答为我指明了正确的方向,也为我的 Google 搜索提供了信息。我并不完全了解文件声明,当沿着这些方向搜索时,我发现了 Joshua Flanagan 的帖子 Tips for building NuGet packages ,这非常好。泽维尔和约书亚一起教会了我一些事情:

  1. 您不必组装符合约定的文件树来构建包。最好使用 file 元素来选择文件并将其定位到已组装的 NuGet 包中的目标目录。
  2. NuGet 的 -Symbols 标志不仅仅适用于打包在 .csproj 文件上。当您在 .csproj 文件上使用它时,当然,它就是如何打包所有源文件的。但您也可以在通过文件元素包含源的 .nuspec 文件上使用 -Symbols。普通的 NuGet 包不会包含 src 目录,但 Symbols 包会包含。

现在,让我描述一下在 CI 服务器上发生的构建过程:

  1. 使用“3.5 版本”解决方案配置构建解决方案。
  2. 使用“4.0 版本”解决方案配置构建解决方案。
  3. 使用 ILMerge.exe 内部化一些程序集。我将这些输出保存到(例如)bin\Release-3.5\merged,因此在合并中使用它之前,我不必费力地将目标程序集重命名为 temp.dll。<
  4. 在 Powershell 中根据 .nuspec 构建软件包。

这是打包命令:

nuget pack src\MyProject\MyProject.nuspec -OutputDirectory .\output -Build -Symbols -Version $Version

请注意,$Version 是从构建服务器传入的,因此我可以使用其构建号作为版本的最后部分。

这是 .nuspec 文件:

<?xml version="1.0"?>
<package>
<metadata>
<id>MyProject</id>
<version>0.0.0</version>
<title>MyProject</title>
<authors>David Boike</authors>
<owners>David Boike</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>MyProject</description>
<releaseNotes></releaseNotes>
<copyright>Copyright 2012</copyright>
<tags>my tags</tags>
</metadata>
<files>
<file src="bin\Release-4.0\merged\MyProject.dll" target="lib\net40" />
<file src="bin\Release-4.0\merged\MyProject.pdb" target="lib\net40" />
<file src="bin\Release-4.0\MyProject.xml" target="lib\net40" />
<file src="bin\Release-3.5\merged\MyProject.dll" target="lib\net35" />
<file src="bin\Release-3.5\merged\MyProject.pdb" target="lib\net35" />
<file src="bin\Release-3.5\MyProject.xml" target="lib\net35" />
<file src="**\*.cs" target="src" />
</files>
</package>

请注意,我已从 nuspec 中删除了许多信息丰富的元素,因为这对于像这样的内部项目来说并不重要。

结果是我的私有(private) NuGet 服务器的一个包,其中包含 .NET 3.5 和 4.0 程序集的 DLL、PDB 和 XML 文档,然后是我的私有(private) SymbolServer 的一个单独的符号包,其中包含上述所有内容以及来源。使用NuGet Package Explorer可以很容易地查看这一点。我强烈建议您下载。

最后,我测试了所有内容并使用 Visual Studio setup suggested at symbolsource.org (除了我自己的私有(private)符号服务器)我能够调试代码并轻松地进入源代码。

再次感谢 Xavier 带领我走上正确的道路!

关于nuget - 使用用于内部依赖管理的符号进行多框架 NuGet 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12867495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com