需要自定义 nuget 包帮助

Posted

技术标签:

【中文标题】需要自定义 nuget 包帮助【英文标题】:Custom nuget package help needed 【发布时间】:2018-01-17 10:01:14 【问题描述】:

您好,我想知道我将如何处理这种情况:

我有一个带有调试和发布配置的 .Net PCL 库 我想用它创建一个包含两个配置输出的 nuget 包。 我想使用 VSTS 作为 Debug 构建的符号服务器。 我想在安装包时使用所选配置切换到正确的程序集。

我关注了this answer,但我 从未将目标文件集成到使用的 csproj 文件中。 版本在那里设置为固定数字?

这是我的 nuspec 文件内容:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>My.Assembly</id>
    <version>1.0.0.0</version>
    <title>A Library</title>
    <authors>Me</authors>
    <owners>Me</owners>
    <!-- <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl> -->
    <!-- <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl> -->
    <!-- <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl> -->
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>A Library</description>
    <releaseNotes>Some release notes.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <!-- <tags>Tag1 Tag2</tags> -->
  </metadata>
      <files>
        <file src="bin\**" target="lib" />
        <file src="*.targets" target="build" />
    </files>
</package>

这里建议做什么?

(使用 NuGet 版本:4.4.1.4656)

【问题讨论】:

我已经更新了我的答案,你可以看看它是否对你有帮助。 AFAIK,NuGet 包通常只包含一组特定目标框架的程序集。它并不是真正设计用于发布调试和发布版本。通常,您不会向最终用户发布应用程序的调试版本和单独的发布版本。如果你坚持,你可以检查下面的解决方法。 【参考方案1】:

但我从未将目标文件集成到使用的 csproj 文件中。

不确定为什么您无法将目标文件集成到消费 csproj 文件中,如果 .targets 文件位于 nuget 包中的 build 文件夹下,那么当您将此 nuget 包添加到项目时,.targets文件将被集成到使用的 csproj 文件中。

首先要确保 nuget 包正确:

这是我的.nuspec 文件:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>My.Assembly</id>
    <version>1.0.0</version>
    <authors>Admin</authors>
    <owners>Admin</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>
  <files>
    <file src="bin\**" target="lib" />
    <file src="*.targets" target="build" />
  </files>
</package>

您应该确保.targets 文件与您的.nuspec 文件位于同一文件夹中,在这种情况下,此命令src="*.targets" 可以将.targets 文件包含到nuget 中包。

注意: .targets 文件的名称必须与您的包的 ID 匹配,根据您的情况,.targets 的名称必须是 My。 Assembly.targets

打包.nuspec后,会得到如下结构的nuget包:

然后将这个包安装到你的项目中,安装后卸载项目,编辑项目文件,在.csproj文件中,会导入如下代码:

<Import Project="..\packages\My.Assembly.1.0.0\build\My.Assembly.targets" Condition="Exists('..\packages\My.Assembly.1.0.0\build\My.Assembly.targets')" />

现在,.targets 文件集成到消费 csproj 文件中。

另外,这个解决方案存在一个问题,因为lib文件夹中的dll会自动添加为引用,在项目文件中创建以下内容:

<Reference Include="My.Assembly, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <HintPath>..\packages\My.Assembly.1.0.0\lib\Release\My.Assembly.dll</HintPath>
</Reference>

所以我们不能在 lib 文件夹中设置 dll 文件,我们可以将 dll 文件设置到 tools 文件夹中,然后在 .targets 文件中添加一个目标,以便在构建之前将 dll 文件从 tools 文件夹复制到 lib 文件夹项目:

  <files>
    <file src="bin\Debug\My.Assembly.dll" target="lib\net\$(Configuration)\My.Assembly.dll" />  
    <file src="bin\**" target="tools" />
    <file src="*.targets" target="build" />
  </files>

有关详细信息,您可以参考您引用的线程中的 Arie R 的答案:

How to create a nuget package with both release and debug dll's using nuget package explorer?

希望这会有所帮助。

【讨论】:

感谢您的回答 Leo!我已经设法让它工作了。我不知道 lib 中的程序集在 csproj 中作为参考添加,谢谢。但我认为内容是一个更好的地方。我现在正在努力使用目标框架......当我取得更多进展时,我会更新我的问题。 @grmbl,您能否发布您的解决方案作为答案并在 SO 限制后接受它?这对阅读此线程的其他社区成员可能是有益的。谢谢。

以上是关于需要自定义 nuget 包帮助的主要内容,如果未能解决你的问题,请参考以下文章

Team City 自定义 NuGet 包还原未发生

如何从自定义 NuGet 包运行 EF 迁移?

如果您在c#中的不同路径中使用它,则自定义NuGet不会提供所有方法

如何使用 C# 中的 Nuget 包在谷歌分析中创建自定义维度和自定义指标

NuGet自动更新特定包

nuget错误:无法解析所选源的路径