首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NuGet包不显示依赖项?

NuGet包不显示依赖项?
EN

Stack Overflow用户
提问于 2018-08-13 12:50:55
回答 2查看 11.2K关注 0票数 13

我试图从一个NuGet 4.7.2类库(VS2017)中生成一个NuGet包,但是得到的NuGet包出人意料地没有显示依赖项(这是一个错误)。

我的设置如下:

  • 我的类库是.NET框架4.7.2
  • 我的类库使用另一个NuGet包(它有依赖项)。
  • 我的类库在packageReferences中使用.csproj
  • 我的类库包含一个正确的.nuspec文件
  • 我使用nuget.exe包创建包

nuget.exe pack命令应该自动填写所需的依赖项--以前(在另一个项目中)也是如此。但是,当时我在类库中使用了packages.config而不是packageReferences。这有什么改变吗?

怎么一回事?

如何迫使系统在包中再次包含所需的依赖项?

备注:

  • 包是由我们的MSBuild构建服务器上的一个TeamCity脚本构建的(没有VS2017)。构建脚本调用"nuget.exe还原“和稍后的"nuget.exe包”作为其构建逻辑的一部分。
  • MSBuild是15.7版
  • nuget.exe是4.6.2版
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-14 06:14:57

如何迫使系统再次将所需的依赖项包含在包中?

这是关于当使用PackageReference而不是packages.config时,nuget忽略了依赖项。的一个已知问题。

要解决此问题,可以使用以下解决方法,NuGet团队仍在积极改进此场景:

要打包您的C#类库(它通过csproj本身的PackageReference管理依赖项), 请添加对NuGet.Build.Tasks.Pack ( https://www.nuget.org/packages/NuGet.Build.Tasks.Pack/)的引用,并从命令行运行msbuild /t:pack

我已经测试过这个方法了,效果很好。要确保此解决方案正常工作,我们需要注意以下points

  • 需要将nuget包NuGet.Build.Tasks.Pack添加到项目中。
  • 需要添加属性/p:PackageOutputPath="D:\TesterFolder" -p:Authors=tester
  • 使用命令msbuild.exe /t:pack,:msbuild.exe /t:pack "MyTestLibrary.csproj" /p:PackageOutputPath="D:\TestFolder" -p:Authors=tester

此外,如果要使用.nuspec文件创建nuget包,则应使用以下.nuspec文件:

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyTestLibrary</id>
    <version>1.0.0</version>
    <authors>Tester</authors>
    <owners>Tester</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <group targetFramework=".NETFramework4.7.2">
        <dependency id="Microsoft.Owin" version="4.0.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>

    <files>
        <file src="bin\Debug\MyTestLibrary.dll" target="lib\net472\MyTestLibrary.dll" />
    </files>
</package>

然后我们可以使用nuget.exe pack创建nuget包。但是,使用此方法,我们必须手动填充.nuspec文件中所需的依赖项。

希望这能有所帮助。

票数 15
EN

Stack Overflow用户

发布于 2020-01-09 11:18:55

我得到了同样的问题,并使用第二方式刘利奥提到与帕特里克剧本和一些小的修改,以克服这个问题。以下是步骤:

  1. 复制或下载下面的powershell脚本,命名为NuGetPackDependencies.ps1并将其添加到您的解决方案中(因为我希望在此解决方案中的许多项目中重用相同的脚本)

函数格式-XML {Param (string$xmlfile) $Doc=New-Object system.xml.xmlDataDocument $doc.Load((解析-路径$xmlfile)) $sw=New-Object system.io.stringwriter $writer=New-Object system.xml.xmltextwriter($sw) $writer.Formatting = System.xml.formatting::Indented $doc.WriteContentTo($writer) }‘*’* PowerShell script NugetPackDependencies 1.0.‘*将项目包引用插入为依赖项。进入包清单(nuspec文件)‘’*‘’*启动脚本‘’*‘设置位置-Path $args # Get VB.NET或C#项目文件。如果无法找到退出脚本,$projFile = (ls -Path "*.vbproj","*.csproj“)选择对象-First 1).Name #。如果($projFile -eq $null) {‘*项目文件未找到。退出脚本‘exit} else {“*从项目文件获取包引用:’+ $projFile +‘'”}}#从项目文件获取内容。$projFileContent = ls -Filter $projFile _Get-$projFile#将内容从项目文件转换为XML。$projFileXml = xml$projFileContent # Namespace $nm = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $projFileXml.NameTable $nm.AddNamespace('x','http://schemas.microsoft.com/developer/msbuild/2003') #从项目文件xml获取包引用,并将它们放入包含id和版本的新对象列表中。$packRefs=$projFileXml.SelectNodes('/x:Project/x:ItemGroup/x:PackageReference',$nm/ ForEach-Object { new -Object -TypeName PSObject -Property @{ id = New-Object -TypeName Reflection.AssemblyName -ArgumentList $_.Include version = New-Object -TypeName Reflection.AssemblyName -ArgumentList $_.Version}写-Output $packRefs #为包含id和版本的nuspec文件创建新的XML标记。对象@{L='deps';E ={“<依赖项$packRefsXml= id=”“+ $_.id +”“version=”“+ $_.version +”“/>”}#连接标记。$packRefsXmlConcat = "“$packRefsXml = ForEach-Object { $packRefsXmlConcat = $packRefsXmlConcat + $_.deps }#获取nuspec文件。如果无法找到nuspec文件,则$nuspec = (ls -Path "*.nuspec“而选对象-First 1) $nuspecFile = $nuspec.FullName #。“*”如果(!$nuspecFile) {写-输出‘*未找到Nuspec文件。退出脚本‘exit} all {“*将依赖项插入到nuspec文件中:’‘+ $nuspec.NAme +’}}#使用.NET XmlDocument $xmlNuspec = New-Object System.Xml.XmlDocument $xmlNuspec.PreserveWhitespace = $true $xmlNuspec.Load($nuspecFile) #删除所有依赖项。=$xmlNuspec.package.metadata.SelectNodes("dependencies") $tags ForEach($tag in $tags) { $xmlNuspec.package.metadata.RemoveChild($tag) x\Out-空#抑制不想要的输出}#命名空间。$xmlNuspec.SelectNodes('/x:package/x:metadata',= $nm =新对象-TypeName System.Xml.XmlNamespaceManager -ArgumentList $xmlNuspec.NameTable $nm.AddNamespace('x','') #从xml $metaDataElement =$xmlNuspec.NameTable$nm.AddNamespace获取元数据标记#创建新的依赖项元素$newDependenciesChild =$xmlNuspec.CreateElement(“依赖项”)#将依赖项元素添加到依赖项元素中去--Null#抑制不想要的输出#追加依赖项到元数据子数据,子级为元数据,子级为元数据--抑制不必要的输出#将输出写到临时的nuspec文件中--文件-filepath temp.nuspec #漂亮到nuspec文件,并使用格式-XML函数覆盖原始的nupec文件。格式-XML -xmlfile temp.nuspec _Out- -filepath $nuspecFile # delete temp nuspec。del temp.nuspec“*”“*完成脚本”“*”

2.配置后构建事件

代码语言:javascript
运行
复制
  cd $(SolutionDir)
powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File NuGetPackDependencies.ps1 $(ProjectDir)
  1. 像以前一样构建和发布项目。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51822826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档