自动创建nuget包和许可证列表

时间:2017-05-22 13:37:10

标签: visual-studio nuget

有没有办法在我的解决方案中获得所有使用的nuget软件包的自动更新列表,包括相应许可证的链接,我可以在我的应用程序中显示?

在Visual Studio中从Package Manager控制台运行以下内容可为我提供所需信息:

Get-Project | Get-Package | select Id, Version, LicenseUrl 

如何获取此列表a)自动更新每次更改并b)将其放入我的应用程序?

目标是显示所有这些数据的信息/关于对话框。

2 个答案:

答案 0 :(得分:2)

我找到了一种方法,很确定它有一些限制......

我在预构建事件中调用它:

powershell.exe -ExecutionPolicy Bypass -File $(ProjectDir)\Resources\tools\PreBuildScript.ps1  $(ProjectDir) $(SolutionDir) $(TargetDir)

以下是resources\tools\PreBuildScript.ps1的样子:

param (
    [Parameter(Mandatory=$True)]
    [string]$ProjectDir,
    [Parameter(Mandatory=$True)]
    [string]$SolutionDir,
    [Parameter(Mandatory=$True)]
    [string]$TargetDir
)
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
$nupkgs = Get-ChildItem -Recurse -Filter *.nupkg -Path "$SolutionDir\packages" 
$nuspecs = $nupkgs | %{ [IO.Compression.ZipFile]::OpenRead($_.FullName).Entries | where {$_.Fullname.EndsWith('.nuspec')} } 
$metadata = $nuspecs | %{ 
    ([xml]([System.IO.StreamReader]$_.Open()).ReadToEnd()) | %{New-Object PSObject -Property @{
        Version = $_.package.metadata.version
        Authors = $_.package.metadata.authors 
        Title =  IF ([string]::IsNullOrWhitespace($_.package.metadata.title)){$_.package.metadata.id} else {$_.package.metadata.title}
        LicenseUrl  = $_.package.metadata.licenseUrl
    }}
} 
$metadata | %{ '{0} {1}{4}Autor(en): {2}{4}Lizenz: {3}{4}{4}' -f $_.Title, $_.Version, $_.Authors, $_.LicenseUrl, [Environment]::NewLine } | Out-File "$ProjectDir\Resources\ThirdPartyLicenseOverview.txt"

这给了我一个(丑陋的)文本文件Resources\ThirdPartyLicenseOverview.txt,我可以将其作为嵌入式资源包含在我的应用程序中使用它。

不是最终解决方案,而是一路上......

答案 1 :(得分:0)

  

有没有办法在我的解决方案中获得所有使用过的nuget软件包的自动更新列表,包括指向相应许可证的链接。

据我所知,目前没有任何内容可以让每个更改自动更新列表并将其放入应用程序。

我们无法直接从命令行获取许可信息作为CI构建的一部分,需要创建一个应用程序来打开.nupkg zip文件,从.nuspec文件中提取许可URL并从此下载许可证网址。

或者,您可以使用Visual Studio中的包管理器控制台窗口,并使用一些PowerShell下载许可证文件。但是如果你想把它放到你的应用程序中,你就无法使用包管理器控制台,在这种情况下你无法获得许可证。

此外,我们可以使用PowerShell脚本获取包ID版本并下载许可证文件,但我们仍然需要有人运行脚本来获取ID,版本并下载许可证。如果您仍希望自动更新每个更改,则需要使用PowerShell来监视package.config。应该在包中发生任何更改后自动调用并执行PowerShell脚本,但这很难实现。