Case

140 次浏览

获取项目中全部 NuGet 包以及对应的 License

我们在日常 .NET Core 项目开发的过程中,经常需要获得整个解决方案中所有项目所引用的 NuGet 包的列表、对应的 License,甚至有时候出于法律的考量,我们需要检查 NuGet 包中所有递归引用的内部包的 License。

如果我们手动进行检查,工作量是巨大的,因此我编写了一个 PowerShell 脚本,来自动化完成这个工作。

基本原理

首先,基于 dotnet 命令自带的 list package 方法,及 –include-transitive 参数,来获取全部包引用的列表。
随后,通过 WebClient 下载对应的 License 文件。

使用方法

将 .ps1 文件放置到项目解决方案文件 (.sln) 所在位置并运行即可。

*

In the process of daily .NET Core project development, we often need to obtain a list of NuGet packages referenced by all projects in the solution, corresponding licenses, and sometimes for legal considerations, we need to check all licenses of recursion internal packages in each directly referenced NuGet packages.

If we check it manually, the workload is huge, so I wrote a PowerShell script to automate this task.

Fundamental

It’s based on the list package method that comes with the dotnet command, and the –include-transitive parameter, to obtain a list of all package references. And then, download the corresponding license file through WebClient.

Instructions

Place the .ps1 file in the location of the project solution file (.sln) and run it.

*

# Place the file to .sln folder, and run

dotnet list package --include-transitive > NuGetPackageList.txt

mkdir ".\licenses" > nul 2> nul
echo "Package ID,Package Version,Package Spec URL,License URL" > LicenseList.csv

Select-String "(>)\s+(\S+)\s+(\S+)\s+(\S+)*" NuGetPackageList.txt  |  Select @{Name="Id"; Expression = {$_.Matches.Groups[2]}}, @{Name="Version"; Expression = {$_.Matches.Groups[3]}}  |  Sort-Object -Property @{Expression="Id"; Descending=$false}, @{Expression="Version"; Descending=$false} -unique | % {

    $packageId = $_.Id;
    $packageIdLowerCase = $packageId.ToString().ToLower();
    $packageVersion = $_.Version;
    $packageSpecUrl = "https://api.nuget.org/v3-flatcontainer/$packageIdLowerCase/$packageVersion/$packageIdLowerCase.nuspec"

    Write-Host
    Write-Host("o> $packageId")
    Write-Host("  $packageVersion`n  $packageSpecUrl") -ForegroundColor Green 

    Try {  
        # Refer to https://docs.microsoft.com/en-us/nuget/api/package-base-address-resource#download-package-manifest-nuspec
        $packageSpec = (New-Object System.Net.WebClient).DownloadString($packageSpecUrl);
        $packageLicenseUrl = $packageSpec.package.metadata.licenseUrl;

        Write-Host("  $packageLicenseUrl") -ForegroundColor Green 
        echo "$packageId,$packageVersion,$packageSpecUrl,$packageLicenseUrl" >> LicenseList.csv
        
        Try {
            $filePath = (Join-Path (pwd) 'licenses\') + "$packageId.$packageVersion.txt";
            (New-Object System.Net.WebClient).DownloadFile($packageLicenseUrl, $filePath);
        }
        Catch [system.exception] {
            # Write-Host ($error[0].Exception);
            Write-Host ("!!> Could not download license file for $packageId $packageVersion") -ForegroundColor DarkMagenta
        }
    }
    Catch [system.exception] {
        # Write-Host ($error[0].Exception);
        Write-Host ("!!> Could not read license for $packageId $packageVersion") -ForegroundColor Red
        echo "$packageId,$packageVersion,$packageSpecUrl,(none)" >> LicenseList.csv
    }

}
124 次浏览

VMware 提示与 Device/Credential Guard 不兼容

当我们在较新的 Windows 10 版本 (1909 或更新)使用 VMware Workstation(无论是 Pro 还是 Player 版本)时,会出现 WMware 与 Windows 自带的 Hyper-V 组件互不兼容的问题,从而报错:

“VMware Workstation and Device/Credential Guard are not compatible. VMware Workstation can be run after disabling Device/Credential Guard. Please visit http://www.vmware.com/go/turnoff_CG_DG for more details.”

解决方法:

  1. 开始 – 运行 (Win + R) – 键入 cmd as admin
  2. 在命令提示符键入 bcdedit /set hypervisorlaunchtype off
  3. 重启电脑,即可。

存在的问题:

禁用 Hyper-V 将直接导致依赖于 Hyper-V 的 Docker Desktop 无法正常启用,我们可以下载体验(Edge)版的 Docker Desktop 来禁用与 Hyper-V 相关的功能,并改用 Windows Container。

相关资料:

https://stackoverflow.com/questions/50374506/vmware-workstation-cannot-run-on-windows-10-after-recent-update-to-windows-10
https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/set-up-environment?tabs=Windows-10-Client&redirectedfrom=MSDN
https://www.cnblogs.com/ups216/p/6385663.html

2,261 次浏览

JavaScript: HTML 内容折叠 (Html Content Ellipsis)

2018 年马上就要过去了,这一年真的经历了太多,本应该按惯例写写年终总结的,不过最近真的太忙了,总有些事情是更优先的,又赶上今天有人需要帮忙,索性就把解决这个小问题的代码讲一讲,全当作是对 2018 年的一个告别吧。

其实很久以前,在某个项目中也遇到过这个问题,我们在一个前端 Table (Grid) 中,希望显示出一个包含了 HTML 样式的富文本内容列,但是其内容很长,我们希望可以按照一个指定的字数进行截取(需要继续保留富文本的样式),并将字符串的剩余部分显示为 …

我们知道,通过 CSS ellipsis 也能设置 … 样式,但是这只能按照外围容器的 width 进行设定,无法按照字数进行处理。所以,为了庆祝新年,我们自己动手写一个吧!

Continue reading

1,745 次浏览

如何将 .NET DateTime 转换为 JavaScript Date – 形如:\/Date(1539953962642)\/

前言

在使用 ASP.NET MVC 开发 Web 程序时,对于 DateTime 类型的数据在 JSON 结果中,以类似于 “\/Date(1539953962642)\/” 的形式进行返回,那么这里中格式叫做什么呢?其中的数字的意义如何?

实际上这种数据格式叫做 Microsoft’s built-in JSON Date format,这不是任何一个通用规范的一部分,它是微软定义的一种格式。并且这里的数字并不是 .NET DateTime 的 Ticks!实际上这个值就是 TimeInMillis!


Ticks 和 TimeInMillis 有什么区别?

Ticks 一般是指从 0001-01-01 00:00:00.000 到现在的百纳秒计数,这个计数单位是 100 nanosecond(long 类型存储),.NET 平台使用 Ticks 方式记录时间(比如 [C#] DateTime.UtcNow.Ticks)。

TimeInMillis 一般是指从 1970-01-01 00:00:00.000 到现在的毫秒数,这个单位是 1 millisecond(long 类型存储),Java 和 JavaScript 使用 TimeInMillis 方式记录时间(比如 [JavaScript] Date.now())

所以,我们只需要通过正则表达式提取这个 Microsoft’s built-in JSON Date format 的值,直接应用于 JavaScript 即可。
Continue reading

2,571 次浏览

.NET Standard / Core 项目发布 NuGet 包并使包中的配置文件自动生成到 Bin 下

之前在如何创建 NuGet 包的文章中,曾经提到如何将配置文件(文件夹)包含到 NuGet 包中,并在用户安装了这个 NuGet 包并 build 自己工程后,自动将 Config 文件夹复制到 Bin 下。但是当时我并没有找到 .NET Standard 或 .NET Core 项目的配置方法,因此 Squirrel Framework 只能选择通过 .NET Framework 4.6.2 项目形式生成 NuGet 包(.NET Framework 下 NuGet 的配置方式请查看这篇文章《如何在 NuGet 发布自己的类库包》)。

不过最近有时间,通过半天的尝试终于将 4.6.2 的工程切换到 .NET Standard,这次的关键点在于不必自己去写 .nuspec 配置文件之后通过 dotnet pack 命令进行 build,而是改为直接通过编辑项目文件(.csproj)并通过 Visual Studio 在每次 build 时,自动完成 NuGet 包的生成。具体配置步骤如下:

Continue reading

1,367 次浏览
1,688 次浏览
1,489 次浏览

WP2CSDNBlog 已无法同步文章到 CSDN

WP2CSDNBlog 是 WordPress 下的一款优秀的文章同步插件,由于 CSDN 服务器不再支持离线编写了,所以我们无法继续使用这个插件同步新建的 WordPress 文章。(援引插件作者的评论

不过 博客园 依然可以被 WP2CSDNBlog 插件支持。具体配置信息如下:

  • 博客园(CNBlogs):https://rpc.cnblogs.com/metaweblog/nista(修改为你的用户名)
  • 开源中国(OSChina):https://my.oschina.net/action/xmlrpc
  • 51CTO:http://imguowei.blog.51cto.com/xmlrpc.php
  • CSDN: http://write.blog.csdn.net/xmlrpc/index
  • 新浪博客: http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php
  • 网易(163):http://os.blog.163.com/word