如何从 NuGet 包及其依赖项安装 PowerShell 二进制 cmdlet (C#)

Posted

技术标签:

【中文标题】如何从 NuGet 包及其依赖项安装 PowerShell 二进制 cmdlet (C#)【英文标题】:Howto install a PowerShell binary cmdlet (C#) from a NuGet package with its dependencies 【发布时间】:2021-12-27 14:33:21 【问题描述】:

我使用 C# 开发了一个二进制 cmdlet。项目的 TargetFramework 是 netstandard2.0,程序集(dll)作为 NuGet 包发布。这个程序集和 NuGet 包有一些依赖项(即其他 NuGet)。

使用 PowerShell 在计算机上本地安装我的二进制 cmdlet 的最佳方法是什么,以便我的 cmdlet 在该计算机上可用,以便从 PowerShell 脚本调用。即,我能否使用 Powershell 命令安装 NuGet,以便我的 DLL 及其依赖项可用于 PowerShell?

【问题讨论】:

【参考方案1】:

从 PowerShell 7.2 开始,支持直接安装 NuGet 包。

GitHub issue #6724 请求此类支持。

您的选择是:

如果可行,重新打包您的二进制 cmdlet 及其依赖项作为 PowerShell module,然后可以通过 Import-Module 安装:

PowerShell 模块通常是一个为模块命名的目录,其中包含一个 module manifest 文件 (*.psd1),其中包含有关模块的元数据以及构成模块实现的文件;对于包装 cmdlet DLL 的模块,清单的 RootModule 条目引用该 DLL,RequiredAssemblies 条目引用依赖项。 当调用Publish-Module 发布模块时,它被打包为一个NuGet 包具有Import-Module 可以理解的自定义结构;通常,PowerShell 模块会发布到PowerShell Gallery。 也许这是一个可行的起点:Creating a new module

否则,请使用辅助。 .NET SDK 项目来安装你的 NuGet 包,这是this answer 中概述的一个重要过程。

This MIT-licensed Gist 包含辅助函数 Add-NuGetType,它可以自动执行该过程并额外支持 PowerShell (Core) 7+ 中的 native 库依赖项,如 this answer 中所述;但是,请注意后者不提供严格的版本控制,因此不应在生产中使用。

【讨论】:

@KarloX,请查看我的更新。

以上是关于如何从 NuGet 包及其依赖项安装 PowerShell 二进制 cmdlet (C#)的主要内容,如果未能解决你的问题,请参考以下文章

您如何覆盖传递的 nuget 依赖项

VS 中NuGet 尝试还原程序包时出错"*"已拥有为"**"定义的依赖项

NuGet:将包依赖项显式列出为项目中的包引用,以便可以卸载它们

具有托管依赖项的C ++ / XAML UWP NuGet包

如何从服务器中删除 NuGet 包?

添加nuget包时不会自动安装依赖项