如何使用 NuGet 的内置 PackageManagement 提供程序进行 nuget 恢复?
How can I do a nuget restore using the built-in PackageManagement provider for NuGet?
(我有一种强烈的感觉,这里有一些我不理解的基本知识,所以请耐心等待...)
我在网络共享上有一个本地 NuGet 包提要,上面有一些包,我有一个用户 NuGet.Config
文件指向该网络共享作为包源。在项目文件夹(git 存储库)中,我有一个 packages.config
文件,该文件按名称引用来自该本地提要的包。我想将这个包恢复到这个项目文件夹中。
我认为,这之所以困难,是因为这不是一个 Visual Studio 项目。我在常规文本编辑器中使用它,并有一些 PowerShell 构建脚本。
我知道我可以只下载 nuget.exe 二进制文件并将其放在我的路径或工作目录中,然后从命令行执行 nuget restore
,但我正在尝试解决的问题这是一种哲学上的纯洁性。即:
- 我的存储库应该是可移植的,具有最少的先决条件依赖性
- 我的存储库不得包含无关的二进制文件或不属于它的代码
因此,我无法将 nuget.exe
二进制文件提交到我的存储库以使其可移植;相反,我想依赖 "modern Windows 10 environment" 的先决条件依赖项,它为我提供了 PowerShell 和内置的 PackageManagement 工具,这些工具能够 bootstrap 各种提供程序,包括 PowerShellGet 和 NuGet。
这条感觉是正确的道路,因为 PackageManagement 被设计为任何包管理解决方案的内置统一接口。 (但我是不是误解了这一点,它实际上只是为了将软件安装到您的操作系统或用户帐户?我找不到任何明确描述这一点的东西。)
那么,是否可以利用内置的 PackageManagement 在 Visual Studio 范围之外从 packages.config
文件执行 nuget restore
(或等效)?或者,如果不是直接的,是否有 obvious/simple 解决方案来 bootstrap 从 PackageManagement 连接到可以完成这种恢复的东西?
您可以从 NuGet 团队的 NuGet.Client repo, where they have a configure.ps1 powershell script that sets up the repo for development/building, and it calls two custom cmdlets Install-NuGet
(download nuget.exe from a fixed HTTP source) and then Restore-SolutionPackages
(restores a packages.config
file), both defined in a common.ps1 文件中获取灵感。
因此,您可以使用一个 powershell 脚本来下载 nuget.exe 和 运行 的恢复。这意味着在克隆 repo 之后(偶尔在 pull 之后),开发人员在使用 Visual Studio 构建解决方案之前需要执行额外的手动操作。但是,如果这是 NuGet 团队自己做的方式,它可能不会太可怕,对吧?至少有你可以指出的先例。
如果让开发人员手动 运行 执行此操作的脚本对您来说是个问题,您可以调查自定义 MSBuild 目标(从相关的 csproj 文件中包含它,或者简单地创建一个 Directory.Build.targets file) and make MSBuild do it when you build the solution. However, you'll probably want to spend time making sure that incremental builds为您的自定义目标正确设置,否则会减慢构建时间。
(我有一种强烈的感觉,这里有一些我不理解的基本知识,所以请耐心等待...)
我在网络共享上有一个本地 NuGet 包提要,上面有一些包,我有一个用户 NuGet.Config
文件指向该网络共享作为包源。在项目文件夹(git 存储库)中,我有一个 packages.config
文件,该文件按名称引用来自该本地提要的包。我想将这个包恢复到这个项目文件夹中。
我认为,这之所以困难,是因为这不是一个 Visual Studio 项目。我在常规文本编辑器中使用它,并有一些 PowerShell 构建脚本。
我知道我可以只下载 nuget.exe 二进制文件并将其放在我的路径或工作目录中,然后从命令行执行 nuget restore
,但我正在尝试解决的问题这是一种哲学上的纯洁性。即:
- 我的存储库应该是可移植的,具有最少的先决条件依赖性
- 我的存储库不得包含无关的二进制文件或不属于它的代码
因此,我无法将 nuget.exe
二进制文件提交到我的存储库以使其可移植;相反,我想依赖 "modern Windows 10 environment" 的先决条件依赖项,它为我提供了 PowerShell 和内置的 PackageManagement 工具,这些工具能够 bootstrap 各种提供程序,包括 PowerShellGet 和 NuGet。
这条感觉是正确的道路,因为 PackageManagement 被设计为任何包管理解决方案的内置统一接口。 (但我是不是误解了这一点,它实际上只是为了将软件安装到您的操作系统或用户帐户?我找不到任何明确描述这一点的东西。)
那么,是否可以利用内置的 PackageManagement 在 Visual Studio 范围之外从 packages.config
文件执行 nuget restore
(或等效)?或者,如果不是直接的,是否有 obvious/simple 解决方案来 bootstrap 从 PackageManagement 连接到可以完成这种恢复的东西?
您可以从 NuGet 团队的 NuGet.Client repo, where they have a configure.ps1 powershell script that sets up the repo for development/building, and it calls two custom cmdlets Install-NuGet
(download nuget.exe from a fixed HTTP source) and then Restore-SolutionPackages
(restores a packages.config
file), both defined in a common.ps1 文件中获取灵感。
因此,您可以使用一个 powershell 脚本来下载 nuget.exe 和 运行 的恢复。这意味着在克隆 repo 之后(偶尔在 pull 之后),开发人员在使用 Visual Studio 构建解决方案之前需要执行额外的手动操作。但是,如果这是 NuGet 团队自己做的方式,它可能不会太可怕,对吧?至少有你可以指出的先例。
如果让开发人员手动 运行 执行此操作的脚本对您来说是个问题,您可以调查自定义 MSBuild 目标(从相关的 csproj 文件中包含它,或者简单地创建一个 Directory.Build.targets file) and make MSBuild do it when you build the solution. However, you'll probably want to spend time making sure that incremental builds为您的自定义目标正确设置,否则会减慢构建时间。