ChatGPT解决这个技术问题 Extra ChatGPT

使用命令行提取 Nupkg 文件

首先,在处理某些 .nupkg 文件时,我根本不想使用 Visual Studio。

我知道有一个名为 NuGet Package Explorer 的工具,它可以使用 gui 将 nupkg 文件导出到某个文件位置,但我希望设置一个 MSBuild 任务来运行和解压缩大约 50 个 .nupkg 文件,使用命令行。

我的问题是,有没有可以通过命令行使用的工具,可以将 .nupkg 文件解压到指定的文件位置?


C
Calvin Allen

NuPKG 文件只是 zip 文件,因此任何可以处理 zip 文件的文件都应该能够处理 nupkg 文件,即 7zip。


有一个附带条件,即 NuGet 似乎对文件名进行了某种编码。因此,如果您使用 zip 工具,您最初命名为“A+B.txt”的文件将被提取为“A%2B.txt”。使用 nuget install 可以避免这种情况(根据安迪的回答)
文件编码问题已在 4.7.0+ 中修复
github.com/NuGet/Home/issues/9459 链接到不编码文件名的一些副作用,还链接到评论中的原始问题,以供参考。注意:这是 Nuget 2.x 的兼容性问题
K
Keith Pinson

您还可以通过将本地主机指定为安装的一部分来使用 NuGet 命令行。例如,如果您的包存储在当前目录中

nuget install MyPackage -Source %cd% -OutputDirectory packages

将其解压缩到目标目录中。


请注意,MyPackage 实际上是在 .nuspec 文件中指定的包 ID,而不是文件名。
并且您必须从具有管理员权限的控制台执行它
Fwiw,在 powershell 中,命令如下所示: nuget install MyPackage -Source $pwd -OutputDirectory packages
我猜 %cd% 指的是当前目录。如何在本地系统中引用不同的路径?当我使用路径时它不起作用。 “./示例/路径/”
我使用文件目录的绝对路径来让 -Source 为我工作。我没有包括包名。
S
Shadi Alnamrouti

将其重命名为 .zip,然后解压缩。


这是一个非常古老的问题,如果您只是将其更改为不会回答问题的 zip,如果您使用 zip 工具,例如您最初命名为“A+B.txt”的文件将被提取为“A %2B.txt" - 您也不需要将其重命名为 zip。
U
UsmanShabbir

做了同样的事情:

clear
cd PACKAGE_DIRECTORY

function Expand-ZIPFile($file, $destination)
{
    $shell = New-Object -ComObject Shell.Application
    $zip = $shell.NameSpace($file)
    foreach($item in $zip.items())
    {
        $shell.Namespace($destination).copyhere($item)
    }
}

Dir *.nupkg | rename-item -newname {  $_.name  -replace ".nupkg",".zip"  }

Expand-ZIPFile "Package.1.0.0.zip" “DESTINATION_PATH”

这是否与上面提到的 Oli Wennell 有同样的问题?即例如“A+B.txt”将被提取为“A%2B.txt”?
M
Mariusz

使用 PowerShell 5.1(包管理模块)

Install-Package -Name MyPackage -Source (Get-Location).Path -Destination C:\outputdirectory

L
Lumito

这对我有用:

Rename-Item -Path A_Package.nupkg -NewName A_Package.zip

Expand-Archive -Path A_Package.zip -DestinationPath C:\Reference

至少在 PS 7.1.2 中,您可以在不更改 MacOS 上的文件扩展名的情况下使用 Expand-Archive。
@Phatmandrake +1 你是对的,这应该是一个答案,我刚刚在 Big Sur + PS 7.1.3 上验证了自己
D
David Morrow

我已经用 7-zip 扩展了 Zamarin.Essentials -version 1.6.1 并且 nuget 包管理器无法识别这个包,我将源设置为所有。我也只尝试过我的全局包源。

另外我注意到包管理器将多个版本下载到同一个文件夹,想知道是否可以将版本文件夹放入包中并将包端复制到其中?