2

我正在使用PowerShellGet从我的本地 Nuget 源安装我自己的 PowerShell 模块(按此处打包和发布)。

我像这样安装一次:

Install-Module MyModule -Scope CurrentUser

然后我像这样更新它:

Update-Module MyModule

它按预期工作,但在每次版本更新后,我都会得到模块的副本而不是覆盖:

Get-Module MyModule -ListAvailable

# Output
    Directory: C:\Users\user\Documents\WindowsPowerShell\Modules

ModuleType Version    Name       ExportedCommands
---------- -------    ----       ----------------
Manifest   1.0.0.40   MyModule   {...}
Manifest   1.0.0.39   MyModule   {...}
Manifest   1.0.0.38   MyModule   {...}

在最新版本中删除的函数仍然可用,并且 PowerShell ISE 自动完成显示每个函数的重复项:

powershell_ise 中的示例


更新

@CmdrTchort 提出了额外的调查检查,这里是结果。

检查模块的安装位置

Get-Module -Name MyModule -ListAvailable | %{ $_.ModuleBase }

正如预期的那样,PowerShellGet 将它们安装到%USERPROFILE%\Documents\WindowsPowerShell\Modules

C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.1.1
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.40
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.39
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.38

我看到它$PSScriptRoot包含那条路径。

检查更新模块将做什么

Update-Module -Name MyModule -WhatIf
# Result
# What if: Performing the operation "Update-Module" on target "Version '1.0.1.1' of module 'MyModule', updating to version '1.0.1.2'".

检查,实际导入的是哪个版本:

  1. 启动新powershell控制台
  2. 运行Get-Module以确保 MyModule 根本没有导入
  3. 从 MyModule 运行任何 cmdlet
  4. Get-Module检查,通过再次执行只导入了一个最新版本的 MyModule

对我来说是:

ModuleType Version    Name       ExportedCommands
---------- -------    ----       ----------------
Manifest   1.0.1.2    MyModule   {...

结论

看来,这里没有问题,正如@CmdrTchort 所写,预计会Get-Module -ListAvailable显示安装的所有版本。

我认为 PowerShell 自动完成在 powershell 和 powershell_ise 中的行为有点令人困惑,因为如果可用的版本很少并且从最新版本中删除了功能,它会显示相同功能的重复,可能会很快改变或以某种方式配置。

4

1 回答 1

1

打包新版本时如何捆绑模块?

Powershell 支持加载同一模块的多个版本(ListAvailable 为您提供各种版本)。

你能做一个 Get-module MyModule -ListAvailable 并打印完整的模块路径来检查它们是如何安装的吗?

您是否正在更新每个版本的模块清单并将其捆绑在新文件夹中?

您可以将同一模块的两个版本加载到您的 Powershell 会话中;如果是这样,最后导入的 cmdlet 就是有效的。

Import-Module 还支持 -MimimumVersion og RequiredVersion。

当您在使用常规 Import-Module 时遇到问题时,我怀疑它的结构和 PSModulePath 存在一些混乱。

也许 $PSModulePath 与每次新升级的“版本”路径连接,而不是像通常那样更新它?在这种情况下; “第一个”版本可能是加载的版本,在另一个版本上获得了在场规则。我也会快速检查一下 $PSModulePath 中有什么。

当您执行 Update-Module 检查以查看它使用 -WhatIf 开关更新的内容时。

一些安装模块/使用模块的链接:

https://msdn.microsoft.com/en-us/library/dd878350(VS.85).aspx

https://technet.microsoft.com/en-us/library/dn807166.aspx

希望这可以帮助 :)

于 2015-12-15T12:06:03.930 回答