【问题标题】:Dependent DLLs of a NuGet package not copied to output folderNuGet 包的相关 DLL 未复制到输出文件夹
【发布时间】: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。

我的问题:

  1. 为什么 Visual Studio 没有复制我的依赖 dll?
  2. 为什么要复制 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


【解决方案1】:

1.为什么 Visual Studio 没有复制我的依赖 dll?

正如您评论的那样,如果在解决方案中使用项目依赖项,MSBuild 不会复制引用(DLL 文件),以避免项目 SomeLib 项目中的引用污染。所以引用项目的引用不会复制到输出文件夹。

2.为什么要复制Moq的依赖?有什么区别?

作为第一个问题的答案,Moq 的依赖项不应复制到 MyWinFormsApp 的输出文件夹中。所以你需要检查你是否已经将 Moq 包安装到 MyWinFormsApp 项目中,你可以检查 MyWinFormsApp 的引用,确保你只有 SomeLib 项目的项目引用。

希望对你有帮助。

【讨论】:

  • 感谢您的回复。在我看来,您所说的“参考污染”是“满足依赖关系”。该解决方案只需要该组件。没有它就不会开始。而且我很确定我没有在 MyWinFormsApp 中添加对 Moq 的引用。有关更多见解,请参阅我在原始帖子中的编辑...
  • 不确定您是如何创建测试解决方案的。您是否曾经打包过 SomeLib 项目,然后将其安装到 MyWinFormsApp 项目中?还是只是项目参考?我的重现步骤是:创建 SomeLib 项目->添加 Moq nuget 包->创建控制台应用程序项目 MyWinFormsApp->添加 SomeLib 项目作为对 MyWinFormsApp 项目的项目引用(不打包 SomeLib 项目)->构建 MyWinFormsApp 项目。你有什么不同吗?
【解决方案2】:

右键单击项目中的“Newtonsoft.json”引用并选择属性。 在属性页中检查“复制本地”属性是否设置为“真”。

【讨论】:

  • 在 SomeLib.csproj 中,Copy Local 设置为 true。这就是它被复制到该项目的输出文件夹的原因。 MyWinFormsApp 项目没有对该 DLL 的引用,因此我无法设置 Copy Local。
猜你喜欢
  • 2018-10-13
  • 2022-01-15
  • 2021-09-10
  • 1970-01-01
  • 2021-09-16
  • 2018-12-16
  • 2013-10-08
  • 1970-01-01
  • 2013-03-26
相关资源
最近更新 更多