【发布时间】: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 文件。我找不到比这更好的解决方案了。