Mic*_*ski 6 .net msbuild nuget
我们的nupkg包包含相同dll的多个版本(x86,x64,AnyCPU),在csproj文件中,在引用中我使用条件引用来根据当前平台集选择特定的dll.因此,我有多个对同一个库的引用(只是不同的平台编译).
这是我的csproj文件的一个片段:
<Reference Include="xxxx" Condition="'$(Platform)'=='x86'">
<HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x86\xxxx.dll</HintPath>
</Reference>
<Reference Include="xxxx" Condition="'$(Platform)'=='x64'">
<HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x64\xxxx.dll</HintPath>
</Reference>
<Reference Include="xxxx" Condition="'$(Platform)'=='AnyCPU'">
<HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\AnyCPU\xxxx.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
这种结构在MSBuild和Visual Studio中都能很好地工作.
不幸的是,在nuget更新之后,csproj引用搞砸了.这是结果:
<Reference Include="xxxx" Condition="'$(Platform)'=='x86'">
<HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x86\xxxx.dll</HintPath>
</Reference>
<Reference Include="xxxx" Condition="'$(Platform)'=='x64'">
<HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x64\xxxx.dll</HintPath>
</Reference>
<Reference Include="xxxx">
<HintPath>..\..\packages\xxxx.2.7.0.1094\lib\net45\x86\xxxx.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
所以看起来只有一个引用被更新了...... 条件部分被删除以及列表中的第一个dll被使用了.
不是我所期待的.任何想法如何最好地解决这个问题?任何人在你的csproj中使用带有nuget的条件引用?任何建议将不胜感激!
Nuget允许您部署自动包含在项目中的.targets文件(请参阅Nuget文档).你可以在自定义目标文件中包含条件引用,并将dll部署在包的tools文件夹中,这样它们就不会被Nuget自动添加为引用.
让我们假设您的包名为'PackageWithConditionalReferences'.您的nuget包创建的文件夹结构可能如下所示:
tools
lib\net45\x86\xxxx.dll
lib\net45\x64\xxxx.dll
lib\net45\AnyCPU\xxxx.dll
build
PackageWithConditionalReferences.targets
Run Code Online (Sandbox Code Playgroud)
其中PackageWithConditionalReferences.targets有内容:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MyLibDir>$(MSBuildThisFileDirectory)..\tools\net45</MyLibDir>
</PropertyGroup>
<ItemGroup>
<Reference Include="xxxx", Condition="'$(Platform)' == 'x64'">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(MyLibDir)\x64\xxxx.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="xxxx", Condition="'$(Platform)' == 'x86'">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(MyLibDir)\x86\xxxx.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="xxxx", Condition="'$(Platform)' == 'AnyCPU'">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(MyLibDir)\AnyCPU\xxxx.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
确保您的.targets文件被命名为包.安装软件包后,需要重新启动VisualStudio才能看到引用(使用VisualStudio 2015进行测试).
| 归档时间: |
|
| 查看次数: |
1978 次 |
| 最近记录: |