Как я могу подавить «Неутвержденные глаголы» в классах Powershell

#powershell

#powershell

Вопрос:

Для использования класса в сценарии powershell (V7) представляется необходимым объявить модуль, в котором реализован класс (язык Powershell), через

 using module .MyModule.psm1
  

Модуль «MyModule.psm1» импортирует модуль powershell через

 Import-Module powershell-yaml -DisableNameChecking
  

Как я могу подавить предупреждения о «неутвержденных глаголах» во время выполнения скрипта? Опция DisableNameChecking, похоже, здесь не помогает

Полный пример модуля

  Import-Module powershell-yaml -DisableNameChecking

 class TestManager { 
 hidden [string] $NodeTypeApplication = "Application"

 TestManager () {
 }

 [void] StartDeployment()
 {
     Write-Host("starting deployment...")

 }

}
  

Комментарии:

1. Я не могу воспроизвести это, пожалуйста, предоставьте содержимое образца psm1 файла, который демонстрирует эту проблему

2. да, на самом деле это не мой класс, кажется, что импорт модуля внутри модуля, содержащего класс, запускает сообщение. Обновил свой вопрос.

3. это сообщение, созданное самим PoSh или PSReadline? если 2-й, то вы можете определить пользовательское правило, чтобы НЕ показывать это сообщение.

4. он производится оболочкой

Ответ №1:

Хотя вы используете -DisableNameChecking для импорта вложенный модуль ( powershell-yaml ), предупреждение может появиться для заключающего модуля, если нестандартные функции из вложенного модуля становятся частью экспорта заключающего модуля.

У вас есть два варианта:

  • Если вам действительно нужно экспортировать (вложенные) нестандартные функции из вашего прилагаемого модуля:

    • Единственный способ отключить предупреждение и для заключающего модуля — это импортировать его с помощью
      Import-Module -DisableNameChecking также, а не через using module
      .

    • Предостережение: К сожалению, это исключает использование пользовательских классов PowerShell, определенных в вашем модуле using module ; начиная с версии 7.0, пользовательские классы становятся видимыми импортеру только в том случае, если вы используете (см. Справочную информацию на GitHub issue # 2449″).

    • Чтобы решить эту проблему:

      • Определите функции-оболочки для тех нестандартных функций, которые вам нужно экспортировать, и дайте им имена, соответствующие стандартам.
      • Затем исключите нестандартные функции из экспорта вашего модуля — смотрите следующий пункт.
  • В противном случае исключите нестандартные функции из экспорта, что вы можете сделать одним из следующих способов:

    • Если они вам на самом деле не нужны внутри самого вашего модуля, исключите их из импорта, передав в Import-Module параметр -Function только имена функций, которые вам действительно нужны.

    • В противном случае вы можете явно управлять тем, что экспортирует ваш вложенный модуль:

      • Вы можете использовать Export-ModuleMember вызов во вложенном модуле.
      • В качестве альтернативы / дополнительно, вы можете ограничить экспортируемые функции, если вы заставите свой заключающий модуль использовать манифест модуля ( *.psd1 файл).

Вот простая демонстрация исходной проблемы:

 # Create a temp. nested module with a nonstandard function.
'function UnapprovedVerb-Foo { ''unapproved foo'' }' > tmp_nested.psm1

# Create the enclosing module that imports the nested module
# with warnings suppressed.
# However, because the enclosing module has no manifest, the nested
# functions are exported alongside its own functions.
'Import-Module $PSScriptRoot/tmp_nested.psm1 -DisableNameChecking; function Get-Foo { ''foo'' }' > tmp_enclosing.psm1

# This now triggers the warning - as import via `using module` would.
# Adding -DisableNameChecking would silence it, but `using module` has
# no equivalent mechanism - and you need the latter to import *custom PS classes*.
Import-Module ./tmp_enclosing.psm1