Resumo do problema: Quando tento chamar Import-Module de uma função avançada do PowerShell, ele não importa as novas alterações. Talvez seja um problema de cache?
O que funciona até agora:
- Importar o módulo digitando o comando completo no terminal funciona muito bem, mas quero automatizar isso para não ter que digitar o caminho completo toda vez que mudar para um novo módulo.
Import-Module -Name 'G:\Development\POSH\dev\modules\JnTestModule\JnTestModule\JnTestModule.psd1' -Force -Verbose
- Copiar minha função avançada para um arquivo externo chamado testModule.ps1 e executá-lo diretamente da pasta raiz do projeto do módulo também funciona muito bem.
Código de exemplo em testModule.ps1
function Import-JnScriptModule
{
<#
.SYNOPSIS
Quickly import my custom PowerShell script module for testing changes.
.EXAMPLE
Import-JnScriptModule
#>
[CmdletBinding()]
[Alias('imp')]
param()
begin {}
process
{
$modulesRootDirectory = "G:\Development\POSH\dev\modules"
Write-Debug "modulesRootDirectory:$modulesRootDirectory"
$currentDirectory = (Get-Location).Path
Write-Debug "currentDirectory:$currentDirectory"
Write-Verbose "Check if we are in the modules dev directory."
if ($currentDirectory.StartsWith("$modulesRootDirectory"))
{
if(!$moduleName)
{
$moduleName = (Get-Item -Path $currentDirectory).BaseName
}
Write-Debug "moduleName:$moduleName"
$manifestFileName = "$moduleName.psd1"
Write-Debug "manifestFileName:$manifestFileName"
$projectDirectory = Join-Path -Path $modulesRootDirectory -ChildPath $moduleName
Write-Debug "projectDirectory:$projectDirectory"
$moduleManifestFullPath = Join-Path -Path $projectDirectory -ChildPath $moduleName -AdditionalChildPath $manifestFileName
Write-Debug "moduleManifestFullPath:$moduleManifestFullPath"
if ((Test-Path -Path $moduleManifestFullPath) -eq $true)
{
Remove-Module -Name "$moduleName" -Force -ErrorAction SilentlyContinue
Import-Module -Name "$moduleManifestFullPath" -Force -Verbose
}
else
{
Write-Verbose "Unable to find module manifest path at '$moduleManifestFullPath'."
}
}
else
{
Write-Warning "Skipped import because not a module folder."
}
}
end {}
}
Import-JnScriptModule
Essa maneira funciona, mas então preciso incluir uma cópia de testModule.ps1 em cada pasta de projeto de módulos e não poderei usar o alias 'imp' para executá-lo. Também prefiro ter o código em um local central, se possÃvel.
O que eu quero realizar: adicionar a função avançada a um módulo de script personalizado que eu uso para gerenciar meus módulos e, então, usar isso para importar rapidamente um módulo de script personalizado em desenvolvimento.
Gostaria de poder simplesmente digitar alias 'imp' enquanto estiver no diretório do projeto do módulo para uma importação rápida, testar alterações e iterações rápidas. Veja alguns exemplos abaixo.
PS G:\Development\POSH\dev\modules\JnTestModule> imp
PS G:\Development\POSH\dev\modules\JnTestModule2> imp
Quando eu digito 'imp', parece executar a função e importar o módulo, mas as últimas alterações não são importadas. Não tenho certeza se isso é um problema de cache ou não, mas na minha função, eu me certifico de remover o módulo existente da sessão antes de forçar outra importação. Isso não está funcionando.
Alguém sabe se existe uma maneira de fazer isso funcionar?
Também estou aberto a outras sugestões ou soluções alternativas. Obrigado!
Seu problema é que importar módulos de um módulo estende essas importações para esse módulo (ou seja, os torna visÃveis apenas ali), enquanto no seu caso você quer que o módulo seja importado para o escopo do chamador (que está no domÃnio de escopo não-módulo ("estado de sessão") ao chamar de fora de um módulo). [1]
Uma solução alternativa simples é adicionar
-Global
às suasImport-Module
chamadas (o que, como o nome sugere, importa o módulo globalmente , ou seja, em todos os domÃnios de escopo, o que também é o que acontece por padrão ao chamarImport-Module
do domÃnio de escopo não-módulo).[1] Para obter mais informações sobre os domÃnios de escopo do PowerShell ("estados de sessão"), consulte esta resposta .