Nuget包不会还原所有DLL和依赖项

时间:2018-04-17 18:23:47

标签: c# visual-studio-2017 nuget nuget-package-restore

我使用Nuget Package Explorer创建了一个Nuget包。该软件包有一些我在我的代码中使用的第三方dll。我的dll包含在Nuget包中,而不是直接在项目引用中引用。 Nuget包具有以下内容。

 - thirdPartyAAA.dll
 - thirdPartyAAA.xml (Needed by thirdPartyAAA.dll)
 - thirdPartyBBB.dll (needed by thirdPartyAAA.dll
 - thirdPartyBBB.dll.config (used by thirdPartyBBB.dll)
 - Dependency on HtmlAgilityPack nuget (Needed by thirdPartyAAA.dll)
 - Dependency om RestSharp nuget (Needed by thirdPartyAAA.dll)

问题是:当我在代码中引用此Nuget包并编译代码时,我只在bin输出文件夹中获取aaa.dll。 bin文件夹中缺少以下文件:

 - thirdPartyAAA.xml
 - thirdPartyBBB.dll
 - thirdPartyBBB.dll.config
 - All dlls from HtmlAgilityPack nuget
 - All dll from RestSharp nuget

在我的代码中,我直接引用thirdPartyAAA.dll。

有没有办法 - 在创建Nuget包期间或引用包时 - 强制Nuget包恢复其所有内容及其依赖项?我需要恢复Nuget包中包含的所有文件,无论它们是否是代码中的直接引用。

谢谢大家的帮助。 如果它有帮助,这是包的清单。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>MyPackage</id>
    <version>1.0.0</version>
    <title></title>
    <authors>Dev</authors>
    <owners>Dev</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>My package description.</description>
    <dependencies>
      <dependency id="HtmlAgilityPack" version="1.4.9" />
      <dependency id="RestSharp" version="105.0.1" />
    </dependencies>
  </metadata>
  <files>
    <file src="content\thirdPartyAAA.chm" target="content\thirdPartyAAA.chm" />
    <file src="content\thirdPartyAAA.XML" target="content\thirdPartyAAA.XML" />
    <file src="content\thirdPartyBBB.dll.config" target="content\thirdPartyBBB.dll.config" />
    <file src="lib\thirdPartyAAA.dll" target="lib\thirdPartyAAA.dll" />
    <file src="lib\thirdPartyBBB.dll" target="lib\thirdPartyBBB.dll" />
  </files>
</package>

4 个答案:

答案 0 :(得分:1)

  

问题是:当我在代码中引用此Nuget包并编译代码时,我只在bin输出文件夹中获取aaa.dll。 bin文件夹中缺少以下文件:

 - thirdPartyAAA.xml
 - thirdPartyBBB.dll
 - thirdPartyBBB.dll.config
 - All dlls from HtmlAgilityPack nuget
 - All dll from RestSharp nuget

首先,对于thirdPartyBBB.dll,您应该确保项目的目标框架版本高于您的dll目标框架。例如,如果项目的目标框架版本是.net 4.6.2,则thirdPartyBBB.dll的目标框架版本应低于.net 4.6.2。否则,您将具有更高版本目标框架的dll文件引用到具有较低版本目标框架的项目。这是不相容的。

此外,对于此程序包的依赖项,您可以检查是否将这些依赖项添加到项目中,并将这些dll的属性复制本地设置为True。它在我身边很好。

其次,对于内容文件,您应该在包中的build文件夹中添加.targets文件,并使用以下代码将这些内容文件复制到bin文件夹:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="$(ProjectDir)thirdPartyAAA.chm">
      <Link>thirdPartyAAA.chm</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CustomToolNamespace></CustomToolNamespace>
    </None>
    <None Include="$(ProjectDir)thirdPartyAAA.XML">
      <Link>thirdPartyAAA.XML</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CustomToolNamespace></CustomToolNamespace>
    </None>
    <None Include="$(ProjectDir)thirdPartyBBB.dll.config">
      <Link>thirdPartyBBB.dll.config</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CustomToolNamespace></CustomToolNamespace>
    </None>
  </ItemGroup>
</Project>

有关详细信息,请查看this thread

或者,您可以使用Install.ps1文件来更改属性,脚本如下所示:

param($installPath, $toolsPath, $package, $project)

function MarkDirectoryAsCopyToOutputRecursive($item)
{
    $item.ProjectItems | ForEach-Object { MarkFileASCopyToOutputDirectory($_) }
}

function MarkFileASCopyToOutputDirectory($item)
{
    Try
    {
        Write-Host Try set $item.Name
        $item.Properties.Item("CopyToOutputDirectory").Value = 2
    }
    Catch
    {
        Write-Host RecurseOn $item.Name
        MarkDirectoryAsCopyToOutputRecursive($item)
    }
}

#Now mark everything in the a directory as "Copy to newer"
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("TheFolderOfYourContentFiles"))

您可以查看similar issue了解详情。

此外,我已经创建了一个测试nuget包,您可以检查它是否适合您,使用目标框架4.6及更高版本的.net框架项目进行测试。

https://1drv.ms/u/s!Ai1sp_yvodHf1QJriMiGQWdYveRm

希望这有帮助。

答案 1 :(得分:0)

转到您的解决方案资源管理器, 在Ur项目参考, 右键单击bin文件夹中缺少的DLL。选择属性,然后将“copy local”设置为true。这将在编译后将DLL复制到构建路径。

答案 2 :(得分:0)

转到您的解决方案资源管理器, 在Ur项目参考, 右键单击bin文件夹中缺少的DLL。选择属性,然后制作&#34;复制本地&#34;为真。这将在编译后将DLL复制到构建路径。

对于nuget恢复,请参阅以下链接

https://docs.microsoft.com/en-us/nuget/consume-packages/package-restore-troubleshooting

答案 3 :(得分:0)

我最近遇到了几乎完全相同的问题。

两天后,我发现了几则帖子,澄清了内容文件夹仅在nuget的+ initial +安装期间部署。

这意味着,像CONTENT中部署的任何文件一样,都将被检查到版本控制系统中,就像项目中的其他任何代码一样。

当VS运行“程序包还原”时,不会像部署项目时一样部署它们,并且某些程序包丢失。