And*_*der 8 powershell powershell-module
我正在创建一个模块,该模块依赖于我需要加载到全局环境中的其他几个模块.我尝试创建一个脚本并使用ScriptsToProcess导入模块,但看起来在ScriptstoProcess运行之前检查RequiredModules.
在模块清单中是否有一个很好的,干净的方法来同时需要一个模块并在它尚未加载时自动加载它?如果无法加载模块,则RequiredModule将抛出错误.
小智 9
PowerShell V3的工作方式有所不同.现在,在加载指定了该键的清单时,将加载所需的模块.此外,无论该模块如何加载,删除模块都不会卸载所需的模块.有趣的是,-Force似乎没有显示所需模块的自动加载.
编辑:如果您的模块不在默认位置之一,则需要将该模块的路径(或模块所在的父文件夹)添加到$env:PSModulePath变量中.
旁注:由于PSv3 #Requires在脚本中支持该命令.您可以使用此方法(1)尝试在脚本中加载模块依赖项,(2)如果模块未加载/无法加载则终止.
#Requires -Modules ModuleName1,ModuleName2
Run Code Online (Sandbox Code Playgroud)
这也需要模块位于其下$env:PSModulePath,必须在运行脚本之前设置.
如果您要分发模块,这也是确保人们使用PowerShellGet(即PowerShell Gallery)安装依赖项的唯一方法.
如果缺少所需的模块,它仍然会失败,但是否则会按照您希望的方式完成.
在任何一种情况下,用户都可以通过键入来手动加载需求Import-Module RequiredModule, YourModule- 如果已经导入,他们将不会获得第二个实例...
您也可以在NestedModules中指定模块.即使在PowerShell 2中,这些也会被"加载"到您的模块内部,但是当它们已经加载时似乎不会对资源产生负面影响.但是,正如@JasonMArcher提醒我的那样,在PowerShell 2中,如果你的模块被卸载(通过Remove-Module),NestedModules会随你的模块一起卸载,即使它们是由用户单独预加载的,也会发生这种情况,最终可能会由于您的用户不会期望,因此会生成非常奇怪的错误报告.
另一个适用于所有PowerShell版本的选项是Import-Module在模块顶部调用(在检查以确保模块尚未加载之后的psm1脚本中),-ErrorAction Stop以便模块的导入失败如果依赖模块的导入失败.
if (!(Get-Module Dependency)) { ## Or check for the cmdlets you need
## Load it nested, and we'll automatically remove it during clean up
Import-Module Dependency -ErrorAction Stop
}
Run Code Online (Sandbox Code Playgroud)
实际上,如果你想检查版本......
if (!(Get-Module Dependency | Where { $_.Version -ge "2.5" )) {
## Load version 2.5 (or newer), or die
Import-Module Dependency -Version 2.5 -ErrorAction Stop
}
Run Code Online (Sandbox Code Playgroud)
请记住,这不作为文档,因此如果您分发模块,您的用户将不会知道依赖项.
| 归档时间: |
|
| 查看次数: |
11237 次 |
| 最近记录: |