【发布时间】:2017-09-01 15:08:45
【问题描述】:
我创建的自定义 Nuget 包出现问题。我们称之为 MyCompany.Library.nupkg。它托管在企业 Artifactory Nuget 存储库上。这个包依赖于 Newtonsoft.Json。由于某种原因,如果我引用使用该 Nuget 包的项目,则依赖 DLL 不会复制到我的项目的输出文件夹中。奇怪的是,当我使用另一个包(例如 Moq,而不是我自己的)时,依赖的 DLL 会被复制。
我已经创建了测试解决方案来重现该问题:
解决方案参考测试:
- 项目:SomeLib.dll;参考:
- MyCompany.Library Nupkg(取决于 Newtonsoft.Json,因此也添加了)
- 最小起订量 Nupkg(取决于 Castle.Core,也已添加)
- 项目:MyWinFormsApp.exe;项目参考:
- SomeLib.csproj
当我查看 SomeLib 的输出文件夹时,我看到:
- SomeLib.dll
- Moq.dll
- Castle.Core.dll
- MyCompany.Library.dll
- Newtonsoft.Json.dll
看起来不错。
但是当我查看 MyWinFormsApp 的输出文件夹时,缺少 Newtonsoft.Json.dll 并且在运行应用程序时,它会抛出找不到 Newtonsoft.Json dll 的异常。但是,Castle.Core.dll 位于 MyWinFormsApp 的输出文件夹中。
我已经比较了 Moq 和 MyCompany.Library 的 nuspecs,我真的找不到任何显着差异。
我可以更改所有使用我的 SomeLib 来引用 Newtonsoft.Json 的项目,但这是很多项目,我不想打扰其他开发人员。他们不必知道 SomeLib 使用该程序集。
SomeLib.csproj 中的引用是这样的:
<ItemGroup>
<Reference Include="MyCompany.Library, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MyCompany.Library.1.0.0\lib\net461\MyCompany.Library.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Moq, Version=4.5.28.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.28\lib\net45\Moq.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.8.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
我的 Nuspec 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MyCompany.Library</id>
<version>0.0.0</version>
<description>MyCompany Core library</description>
<authors>MyCompany</authors>
<references>
<reference file="MyCompany.Library.dll" />
</references>
<dependencies>
<dependency id="Newtonsoft.Json" version="[8.0,9.0.1]" />
</dependencies>
</metadata>
<files>
<file src="MyCompany.Library\bin\Release\MyCompany.Library.dll" target="lib\net461"/>
<file src="MyCompany.Library\bin\Release\MyCompany.Library.pdb" target="lib\net461"/>
<file src="MyCompany.Library\bin\Release\MyCompany.Library.xml" target="lib\net461"/>
</files>
</package>
我正在使用 Visual Studio 2015 Professional。
我的问题:
- 为什么 Visual Studio 没有复制我的依赖 dll?
- 为什么要复制 Moq 的依赖关系?有什么区别?
感谢您的帮助。
基多
编辑
我一直在比较起订量的 NUSPEC 和我自己的包裹,(完全绝望)我发现了一个差异。起订量 Nuspec 包含:
<dependencies>
<group targetFramework=".NETFramework4.5">
<dependency id="Castle.Core" version="3.3.3" />
</group>
</dependencies>
我自己的包裹包含:
<dependencies>
<dependency id="Newtonsoft.Json" version="[8.0,9.0.1]" />
</dependencies>
我更改了我的依赖项以指定一个 targetFramework,现在 VisualStudio 确实复制了我的依赖项!
NuSpec 是我唯一改变的东西,这真的解决了它。我一直在反复考虑使用和不使用 targetFramework 的情况,结果是一致的(没有 targetFramework 的失败和 targetFramework 的成功)。
所以:问题解决了,但我不知道为什么......
【问题讨论】:
-
我发现了关于这个主题的另一个问题。 stackoverflow.com/questions/1132243/… 看起来像是 VS / MSBuild 中的一个错误。关于该主题的公认答案很好地解释了这一点。
标签: c# visual-studio nuget