【问题标题】:NuGet update and conditional referencesNuGet 更新和条件引用
【发布时间】:2014-06-17 02:27:54
【问题描述】:

我们的 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 条件引用吗?任何建议将不胜感激!

【问题讨论】:

  • Nuget 对 .csproj 引用做了巫术。以上是我想要解决方案级别的 nuget 包的另一个原因......并且是无版本的。让我用内部版本号范围控制版本控制。我来自 java/ivy 世界.......它允许您在解决方案级别处理二进制依赖项。我不认为你会找到解决办法,但希望我错了,有人会插话。
  • 谢谢,恐怕您是对的,我们正在考虑采用的方法是自己更新 csproj 文件,作为 MSBuild“nuget-update”目标的一部分。我希望有人会知道更好的方法:/解决方案级别的依赖关系是有意义的,尤其是在一个应用程序中引用同一个 DLL 的两个不同版本是一个坏主意的情况下。有了项目级别的依赖,这很容易做到。
  • 我“明白”项目级别的依赖情况可能会出现......但解决方案级别的依赖管理对我来说似乎更为主流,而项目级别的依赖则更为边缘化。我不知道为什么 nuget 错过了那条船…………但我也不是抽屉里最锋利的刀。
  • 我在同一条船上。你有没有找到解决这个问题的方法?
  • 不幸的是,在 nuget 更新和修复需要修复的问题后,我们最终只是解析和正则表达式 csproj 文件。我找不到比这更好的解决方案了。

标签: .net msbuild nuget


【解决方案1】:

Nuget 允许您部署一个自动包含在项目中的 .targets 文件(请参阅Nuget docs)。哟,您可以在自定义目标文件中包含条件引用,并将 dll 部署在包的工具文件夹中,这样它们就不会被 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 测试)。

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2015-05-16
    • 2013-12-13
    相关资源
    最近更新 更多