.NET PCL自定义NuGet包咨询:多配置、VSTS符号服务器及targets文件问题
我来一步步帮你搞定这几个棘手的问题: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$变量,打包时直接基于项目文件打包:
这样会自动读取项目AssemblyInfo里的nuget pack My.Assembly.csproj -Properties Configuration=ReleaseAssemblyVersion或AssemblyInformationalVersion作为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),并勾选“自动加载符号”。
验证步骤
- 按照调整后的nuspec和targets文件重新打包。
- 把包上传到你的NuGet源(比如VSTS Artifacts)。
- 在消费项目中安装这个包,切换Debug/Release配置,查看引用的HintPath是否自动切换。
- 调试时检查是否能从VSTS符号服务器加载pdb符号。
内容的提问来源于stack exchange,提问作者ʃʈɑɲ




