2

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

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

我遵循了这个答案,但我从未将目标文件集成到使用的 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)

4

1 回答 1

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 文件的名称必须与您的 package 的 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 的答案:

如何使用 nuget 包资源管理器创建具有发布和调试 dll 的 nuget 包?

希望这可以帮助。

于 2018-01-18T07:15:27.453 回答