You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET PCL自定义NuGet包咨询:多配置、VSTS符号服务器及targets文件问题

解决.NET PCL库多配置NuGet包的几个问题

我来一步步帮你搞定这几个棘手的问题:targets文件不生效、版本固定、Debug/Release自动切换,还有VSTS符号服务器的配置。

一、修复targets文件未集成到消费项目的问题

首先得纠正一个关键细节:NuGet要求build目录下的targets文件名必须和你的包ID完全一致。比如你的包ID是My.Assembly,那targets文件必须命名为My.Assembly.targets,不然NuGet不会自动把它导入到消费项目的csproj里。

另外你当前的<file src="bin\**" target="lib" />会把Debug和Release的文件混在同一个lib目录下,既容易冲突,也没法实现后续的配置切换,得先调整文件结构。

二、实现Debug/Release配置自动切换的NuGet包结构

1. 调整nuspec的files节点

把Debug和Release的输出分别放到lib下的对应子目录,同时确保targets文件的路径正确:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>My.Assembly</id>
    <version>$version$</version> <!-- 用变量实现版本自动化,后面详细讲 -->
    <title>A Library</title>
    <authors>Me</authors>
    <owners>Me</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>A Library</description>
    <releaseNotes>Some release notes.</releaseNotes>
    <copyright>Copyright 2018</copyright>
  </metadata>
  <files>
    <!-- Debug配置的程序集和pdb -->
    <file src="bin\Debug\My.Assembly.dll" target="lib\portable-net45+win8+wp8+wpa81\Debug" /> <!-- 替换成你的PCL实际目标框架 -->
    <file src="bin\Debug\My.Assembly.pdb" target="lib\portable-net45+win8+wp8+wpa81\Debug" />
    <!-- Release配置的程序集 -->
    <file src="bin\Release\My.Assembly.dll" target="lib\portable-net45+win8+wp8+wpa81\Release" />
    <!-- 必须和包ID同名的targets文件,目标框架要和lib对应 -->
    <file src="My.Assembly.targets" target="build\portable-net45+win8+wp8+wpa81" />
  </files>
</package>

注意:把portable-net45+win8+wp8+wpa81替换成你的PCL实际目标框架,保持lib和build目录的目标框架完全一致。

2. 编写My.Assembly.targets文件

这个targets文件的核心作用是根据消费项目的当前配置,自动引用对应的程序集:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
    <Reference Include="My.Assembly">
      <HintPath>$(MSBuildThisFileDirectory)..\lib\portable-net45+win8+wp8+wpa81\Debug\My.Assembly.dll</HintPath>
      <Private>True</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)' == 'Release' ">
    <Reference Include="My.Assembly">
      <HintPath>$(MSBuildThisFileDirectory)..\lib\portable-net45+win8+wp8+wpa81\Release\My.Assembly.dll</HintPath>
      <Private>True</Private>
    </Reference>
  </ItemGroup>
</Project>

同样要替换目标框架路径,确保HintPath能正确指向对应的程序集。

三、版本号自动化(替代固定版本)

你现在用的是固定版本1.0.0.0,可以用以下几种方式实现版本自动更新:

  • 方式一:打包时手动传递版本号
    用NuGet命令行打包时,通过-Version参数指定版本:
    nuget pack My.Assembly.nuspec -Version 1.0.1.0
    
  • 方式二:从AssemblyInfo.cs读取版本
    在nuspec里用$version$变量,打包时直接基于项目文件打包:
    nuget pack My.Assembly.csproj -Properties Configuration=Release
    
    这样会自动读取项目AssemblyInfo里的AssemblyVersionAssemblyInformationalVersion作为NuGet版本。
  • 方式三:VSTS构建自动生成版本
    在VSTS构建定义里启用“自动生成版本号”,比如设置版本格式为1.0.$(Build.BuildId).0,然后在打包步骤中引用这个版本变量(比如$(Build.BuildNumber))。

四、配置VSTS作为Debug构建的符号服务器

要让消费项目能从VSTS下载Debug符号,需要做两步:

1. 打包并上传符号到VSTS

  • 在VSTS构建中添加“NuGet打包”任务,勾选“创建符号包”选项,生成.symbols.nupkg文件。
  • 添加“发布符号”任务,选择“Azure Artifacts符号服务器”作为目标,把pdb上传到VSTS的符号服务器。

2. 消费项目配置符号源

在Visual Studio中,进入“工具”→“选项”→“调试”→“符号”,添加VSTS符号服务器地址(格式为https://你的账号.pkgs.visualstudio.com/_apis/public/symbolregistry/v2),并勾选“自动加载符号”。

验证步骤

  1. 按照调整后的nuspec和targets文件重新打包。
  2. 把包上传到你的NuGet源(比如VSTS Artifacts)。
  3. 在消费项目中安装这个包,切换Debug/Release配置,查看引用的HintPath是否自动切换。
  4. 调试时检查是否能从VSTS符号服务器加载pdb符号。

内容的提问来源于stack exchange,提问作者ʃʈɑɲ

火山引擎 最新活动