如何在 Powershell 二进制模块(.Net Standard & Nuget)中处理 public 和私有依赖和打包
How to handle public and private dependencies and packaging in Powershell binary module (.Net Standard & Nuget)
我有一个示例项目 https://github.com/hagatorn/LunarSolarDate,它是预发布的,所以请原谅没有完成。
如果我构建项目,我可以在 bin 目录中导入模块:
Import-Module .\SolarLunarName.PoSH.dll
然而,当 运行 唯一的命令出现时,我遇到了错误。
Get-Date | Get-SolarLunarName
Get-SolarLunarName : Could not load file or assembly 'RestSharp, Version=106.6.2.0, Culture=neutral,
PublicKeyToken=598062e77f915f75' or one of its dependencies. The system cannot find the file specified.
At line:1 char:12
+ get-date | Get-SolarLunarName
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-SolarLunarName], FileNotFoundException
+ FullyQualifiedErrorId : System.IO.FileNotFoundException,SolarLunarName.PoSH.GetSolarLunarName
这相对容易解决,可以弹出 bin 目录中丢失的 dll。然后出现一条不太有用的消息,但将 Newtonsoft.Json.dll 和 Newtonsoft.Json.pdb 添加到 bin 目录使我遇到了一个问题,我将在一个单独的问题中处理。
手动复制依赖项让我有点担心,所以我开始尝试使用 nuget 构建和部署,希望依赖项可以在此模型中完全处理。
将模块及其私有依赖项作为已发布的 nuget 包发布后,我可以使用以下命令形成依赖项。
nuget.exe install SolarLunarName.PoSH
但是,在初始状态下,依赖项在目录结构中逻辑分离,这使得二进制模块无法访问它们。
作为构建或包安装的集成部分,是否有更好的方法来执行此操作? powershell 可以进行一些包管理并使用 .deps.json 安装 public 依赖项吗?
我看到另一个线程讨论通过对嵌套依赖项进行虚拟调用来强制 msbuild 在 bin 目录输出中包含额外的二进制文件。尽管这个解决方案很方便,但它似乎有点错误并且违背了包管理的逻辑。 Dependent DLL is not getting copied to the build output folder in Visual Studio
还有以下线程,我承认如果包管理确实工作正常并且我误解了问题,则可能是同一个问题。 PowerShell Binary Module assembly dependency error.
最后还有一条关于将您的包标记为 "PSModule" 的线索,我相信我已经在 visual studio 项目属性包页面中完成了此操作。但也许这不是实现该目标的方法?
这个问题是由于缺乏具体的目标框架和不是用 .Net Standard 编写的依赖项造成的,并且在最终编译到目标框架时会出现各种不同的包。
更新版本的 Rest Sharp 可能已经发布,没有这个问题,但是一些 SQLite 驱动程序和 ORM 仍然有这个限制。
我有一个示例项目 https://github.com/hagatorn/LunarSolarDate,它是预发布的,所以请原谅没有完成。
如果我构建项目,我可以在 bin 目录中导入模块:
Import-Module .\SolarLunarName.PoSH.dll
然而,当 运行 唯一的命令出现时,我遇到了错误。
Get-Date | Get-SolarLunarName
Get-SolarLunarName : Could not load file or assembly 'RestSharp, Version=106.6.2.0, Culture=neutral,
PublicKeyToken=598062e77f915f75' or one of its dependencies. The system cannot find the file specified.
At line:1 char:12
+ get-date | Get-SolarLunarName
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-SolarLunarName], FileNotFoundException
+ FullyQualifiedErrorId : System.IO.FileNotFoundException,SolarLunarName.PoSH.GetSolarLunarName
这相对容易解决,可以弹出 bin 目录中丢失的 dll。然后出现一条不太有用的消息,但将 Newtonsoft.Json.dll 和 Newtonsoft.Json.pdb 添加到 bin 目录使我遇到了一个问题,我将在一个单独的问题中处理。
手动复制依赖项让我有点担心,所以我开始尝试使用 nuget 构建和部署,希望依赖项可以在此模型中完全处理。
将模块及其私有依赖项作为已发布的 nuget 包发布后,我可以使用以下命令形成依赖项。
nuget.exe install SolarLunarName.PoSH
但是,在初始状态下,依赖项在目录结构中逻辑分离,这使得二进制模块无法访问它们。
作为构建或包安装的集成部分,是否有更好的方法来执行此操作? powershell 可以进行一些包管理并使用 .deps.json 安装 public 依赖项吗?
我看到另一个线程讨论通过对嵌套依赖项进行虚拟调用来强制 msbuild 在 bin 目录输出中包含额外的二进制文件。尽管这个解决方案很方便,但它似乎有点错误并且违背了包管理的逻辑。 Dependent DLL is not getting copied to the build output folder in Visual Studio
还有以下线程,我承认如果包管理确实工作正常并且我误解了问题,则可能是同一个问题。 PowerShell Binary Module assembly dependency error.
最后还有一条关于将您的包标记为 "PSModule" 的线索,我相信我已经在 visual studio 项目属性包页面中完成了此操作。但也许这不是实现该目标的方法?
这个问题是由于缺乏具体的目标框架和不是用 .Net Standard 编写的依赖项造成的,并且在最终编译到目标框架时会出现各种不同的包。
更新版本的 Rest Sharp 可能已经发布,没有这个问题,但是一些 SQLite 驱动程序和 ORM 仍然有这个限制。