【问题标题】:Automatically create list of nuget packages and licenses自动创建 nuget 包和许可证列表
【发布时间】:2017-05-22 13:37:09
【问题描述】:

有什么方法可以自动更新我的解决方案中所有使用的 nuget 包的列表,包括指向相应许可证的链接,我可以在我的应用程序中显示该链接?

从 Visual Studio 中的包管理器控制台运行以下命令可为我提供所需的信息:

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

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

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

【问题讨论】:

    标签: visual-studio nuget


    【解决方案1】:

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

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

    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,我可以将它作为嵌入资源包含在我的应用程序中。

    不是最终的解决方案,而是前进的一步......

    【讨论】:

    • 这很好 - 请注意,在上面的示例中,OutputDir 未使用。
    【解决方案2】:

    有什么方法可以自动更新我的解决方案中所有使用的 nuget 包的列表,包括指向相应许可证的链接。

    据我所知,目前没有任何方法可用于在每次更改时自动更新列表并将其导入应用程序。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2015-07-19
      • 1970-01-01
      • 2019-05-11
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多