模块自动加载是否可靠?

时间:2015-02-22 18:52:51

标签: powershell module autoloader

环境

我有以下文件夹结构,我保留了PowerShell模块:

C:
  PsModules
     ...
     util
        util.psm1 (this contains implementation of 'Test-Function')
        util.test.ps1
     ftp
        ftp.psm1
        http.test.ps1
     ... 

c:\PsModules中有大约50个文件夹和模块。

我已将环境变量PSModulePath设置为包含c:\PsModules。这似乎符合"格式良好的模块" described in Microsoft's documentationthis answer

症状

从ISE调用时,有时无法自动找到 Test-Function。实际上,在任何新发布的ISE上,总会有一些(似乎不可预测的)模块无法自动找到。例如,无法自动查找Test-Function,如下所示:

PS C:\> Test-Function
Test-Function : The term 'Test-Function' is not recognized as the name 
of a cmdlet, function, script file, or operable program. Check the 
spelling of the name, or if a path was included, verify that the path is 
correct and try again.
...
+ FullyQualifiedErrorId : CommandNotFoundException

乍一看,这似乎表明util.psm1不是"格式良好"。如果它不是"格式良好",那么 ListAvailable 不应该工作。但它确实有效:

c:\> get-module -ListAvailable util
Directory: c:\PsModules\util

ModuleType Version    Name                 ExportedCommands
---------- -------    ----                 ----------------
Script     0.0        util

PS C:\> Test-Function
...
+ FullyQualifiedErrorId : CommandNotFoundException

此外,在为模块调用Get-Command之后,模块中的命令可供一般使用:

c:\> Get-Command -Module util
CommandType     Name                             ModuleName
-----------     ----                             ----------
Function        Test-Function                    util
c:\> Test-Function
Call to Test-Function succeeded!

问题

  1. 自动发现和模块自动加载是否可靠且可预测?

  2. 如何解决为什么在调用Get-Command -module之前,powershell有时无法找到命令?

  3. 依靠powershell自动加载模块是不好的做法吗?如果是这样,自动加载模块的好习惯是什么?

3 个答案:

答案 0 :(得分:3)

我不能说模块自动加载意图是否可靠,但我个人并不完全依赖它。

如果我正在编写脚本或模块,我总是使用Import-Module TheModule -ErrorAction Stop,并经常使用#Requires -Module AciveDirectory,TheModule,SQLPs来确保模块可用。

对于PowerShell控制台或ISE中的交互式使用,我通常依赖于自动加载,但如果失败,我只需{} {}手动进行会话。

在我总是希望为交互式会话加载特定模块的情况下,我将其加载到配置文件中。要查看各种配置文件(从ISE和控制台)运行:

Import-Module

您可以根据您希望模块可用的用户和主机来决定您要在何处放置导入模块的代码。

到目前为止,我只为posh-git执行此操作,但它似乎很适合您的用例。

答案 1 :(得分:1)

如果这对其他人有帮助,我认为这可能是ISE独有的问题。我无法复制,但是最近在ISE工作流行为不一致的情况下使用MS,经过一番努力后,问题仍然没有解决,官方的答案是不使用未经批准生产的ISE,而是使用本机外壳。这对我们来说是一个现实的答案,从来没有在原生shell中看到过这些问题。我想知道这种症状是否相同吗?

答案 2 :(得分:1)

我发现模块清单中的FunctionsToExport部分不能设置为*

这很糟糕:

# Functions to export from this module, for best performance, do not use 
# wildcards and do not delete the entry, use an empty array if there are no 
# functions to export.
FunctionsToExport = '*'

这很好:

# Functions to export from this module...
FunctionsToExport = 'Test-Function, Test-Function2'