我们的项目中要求列出所有许可的nuget软件包。将它们生成为某种csv,json,xml文件是理想的。必须通过构建或CI / CD工具来完成。问题是我找到该列表的唯一方法是致电:
$filter_apostrophe = str_replace('"','', $value);
$separate_the_value = explode(',', $filter_apostrophe);
$data = DB::table('x_poll_questions')
->where('batch_ids','like','%'."".$separate_the_value."".'%') //Filter "" or not
->get()
在Visual Studios包管理器内部。我还发现了一些示例powershell脚本,但它们都基于.net核心之前的.net版本,并且基于.net核心版本中不再存在的读取包文件夹。
有什么方法可以实现.NET Core中所需的功能?
致谢。
答案 0 :(得分:0)
根据Nate McMaster's list of .NET global tools,有一个名为dotnet-project-licenses的工具。我从未使用过,但是您可以尝试一下。
但是,如果您想自己做某事,并不是很困难,但是需要一些代码。
首先使用dotnet list package --include-transitive
列出项目使用的所有软件包,然后解析其输出。 NuGet团队拥有a request来简化输出解析,但是老实说,我认为您只需要2个正则表达式就可以轻松解析其当前输出,如果您不关心TFM,则只需1个正则表达式。如果您的项目针对多个TFM,则需要对列表进行重复数据删除。
一旦有了软件包ID和版本号的列表(版本很重要,因为软件包可能会在版本之间更改许可证),就可以找到全局软件包文件夹(gpf)dotnet nuget locals -l global-packages
的位置,然后使用{gpf}\{lowercase package id}\{lowercase package version}\{lowercase package id}.{lowercase package version}.nuspec
模式将nuspec作为XML加载并找到许可证。
请记住,最近NuGet不推荐使用LicenseUrl并鼓励软件包作者使用许可证表达式,或将其许可证文件嵌入nupkg
中。我想嵌入式许可证对任何许可证工具都构成最大的挑战,因为除非您想解析许可证文本并猜测它最有可能是哪个许可证,否则您将需要执行其他操作。如果所有软件包都来自nuget.org,则可以让您的工具生成指向nuget.org/packages/{package id}/{package version}/license
的URL。但是,如果您使用多个来源,则您将无法知道软件包来自哪个来源,而其他Feed可能无法轻松地查看嵌入式许可证的许可证文本。要“适当地”执行操作,您需要搜索软件包的源,以查看特定的软件包ID和版本是否存在。 NuGet's V3 protocol已记录在案,但故意未记录v2协议,并且某些第三方nuget服务器仅实现v2协议。您也可以考虑使用nuget client libraries。