我使用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>
答案 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运行“程序包还原”时,不会像部署项目时一样部署它们,并且某些程序包丢失。