2014-12-04 3 views
1

Глоссарий:Powershell модуль прервать загрузку на неподдерживаемых хостов

  • Ведущий: PowershellHost сессия
  • Interactive: [Environment]::UserInteractive -eq $True

Сценарий:

Создайте модуль Powershell, что только прервет propertly и без ошибок при неудачном состоянии. В этом случае некоторые команды/модули работают правильно только в полных интерактивных хостов, как ISE и консоли, но не поддельные интерактивных хостов, как NuGet Package Manager Console

Ошибка Решение:

# Add value to Powershell manifest(psd1) 
# Issue: Only supports a string for the `PowerShellHostName` property. How to specify both `ConsoleHost` and `Windows PowerShell ISE Host`? Unknown if this property supports regex, and even if it does, will the behavior change since it's not documented? 
@{ 
    .... 
    # Name of the Windows PowerShell host required by this module 
    # PowerShellHostName = '' 
    .... 
} 

Ошибка Решение:

# Check for interactive shell 
# Issue: UserInteractive is still set in embedded shells like NuGet package manager 
# console. Commands that expect user input directly often hang. 
if([Environment]::UserInteractive) { 
    # Do stuff, dotsource, etc 
} 

Ошибка Решение:

# Issue: returning still leaves module loaded, and it appears in Get-Module list 
# Even if value is supplied for return, powershell's return statement is 'special' 
# and the value is ignored 
if($Host.Name -inotmatch '(ConsoleHost|Windows PowerShell ISE Host)') { 
    Write-Warning "Host [$($Host.Name)] not supported, aborting" 
    return 
} 

Ошибка Решение :

# Issue: Module isn't loaded, so it can't be unloaded 
if($Host.Name -inotmatch '(ConsoleHost|Windows PowerShell ISE Host)') { 
    Remove-Module ThisModuleName 
} 

Ошибка Решение:

# Issue: Powershell module error output is just passthrough, import-module 
# still reports success, even though $Error is has more stuff than before 
if($Host.Name -inotmatch '(ConsoleHost|Windows PowerShell ISE Host)') { 
    Write-Error "Unsupported Host:" $Host.Name 
} 

раздражающее решение:

# Issue: Leaves two errors on the stack, one for the throw, one for the module not 
# loading successfully 
if($Host.Name -inotmatch '(ConsoleHost|Windows PowerShell ISE Host)') { 
    throw "Host [$($Host.Name)] not supported, aborting" 
} 

Не решение:

Force user to wrap the import every time. 

Сомнительное Решение:

Разделить модуль на вложенные подмодули, один для «Common» и по одному для каждого поддерживаемого хоста. Используйте вложенную папку для каждого и дублируйте psd1 для каждого. Похоже, в конечном итоге это будет кошмар ремонтируемости, особенно в отношении вложенных зависимостей.

UberModule 
    /ModuleCommon 
     /ModuleCommon.(psd1|psm1) 
    /ConsoleHostSpecific 
     /ConsoleHostSpecific.(psd1|psm1) 
    /IseHostSpecific 
     /IseHostSpecific.(psd1|psm1) 
    /etc... 

Есть ли лучший способ сделать это, или uber-module расколол единственный путь?

ответ

0

Посмотрите на ключевое слово #requires, оно может предложить несколько вариантов, которые вы еще не пробовали. Я не знаю, имеет ли NuGet Package Manager Console уникальный ShellId или нет.

http://technet.microsoft.com/en-us/library/hh847765.aspx