NuGet更新和条件引用

时间:2014-04-30 16:42:32

标签: .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>

这种结构在MSBuild和Visual Studio中都能很好地工作。

不幸的是,在 nuget update 之后,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>

所以看起来只有一个引用被更新了...... Condition 部分被删除了以及列表中的第一个dll被使用了。

不是我所期待的。任何想法如何最好地解决这个问题?任何人在你的csproj中使用带有nuget的条件引用?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:5)

Nuget允许您部署自动包含在项目中的.targets文件(请参阅Nuget docs)。你可以在自定义目标文件中包含条件引用,并将dll部署在包的tools文件夹中,这样它们就不会被Nuget自动添加为引用。

让我们假设您的包名为'PackageWithConditionalReferences'。您的nuget包创建的文件夹结构可能如下所示:

tools
    lib\net45\x86\xxxx.dll
    lib\net45\x64\xxxx.dll
    lib\net45\AnyCPU\xxxx.dll
build
    PackageWithConditionalReferences.targets

其中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>

确保您的.targets文件被命名为包。安装软件包后,需要重新启动VisualStudio才能看到引用(使用VisualStudio 2015进行测试)。