簡體   English   中英

Nuget程序包不會還原所有DLL和依賴項

[英]Nuget package does not restore all DLLs and Dependencies

我已經使用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>

問題是:當我在代碼中引用此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>

有關一些詳細信息,請檢查此線程

或者,您可以使用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"))

您可以檢查類似的問題以獲取詳細信息。

另外,我創建了一個測試nuget包,您可以檢查它是否適合您,並使用目標框架4.6及更高版本的.net framework項目對其進行測試。

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

希望這可以幫助。

轉到您的解決方案資源管理器,在Ur項目參考上,右鍵單擊bin文件夾中缺少的DLL。 選擇屬性,然后將“本地復制”設置為true。 編譯后,這會將DLL復制到構建路徑。

轉到您的解決方案資源管理器,在Ur項目參考上,右鍵單擊bin文件夾中缺少的DLL。 選擇屬性,然后將“本地復制”設置為true。 編譯后,這會將DLL復制到構建路徑。

要恢復裸露,請參考以下鏈接

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

我最近遇到了幾乎完全相同的問題。

2天后,我發現了幾則帖子,澄清了內容文件夾僅在nuget的+ initial +安裝期間部署。

這意味着,要像部署項目中的任何其他代碼一樣,將任何部署為CONTENT的文件都檢查到版本控制系統中。

當VS運行“程序包還原”時,就不會像部署項目時那樣部署它們,而某些程序包會丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM