Update-Module 复制模块而不是更新

Update-Module duplicates module instead of updating

我正在使用 PowerShellGet to install my own PowerShell module from my local Nuget feed (packed and published as here).

我是这样安装一次的:

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 自动完成显示每个函数的重复项:


更新

@CmdrTchort 建议进行额外检查以进行调查,这是结果。

检查模块的安装位置

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

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

C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule.0.1.1
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule.0.0.40
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule.0.0.39
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule.0.0.38

我看到 $PSScriptRoot 包含该路径。

检查 Update-Module 将做什么

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_ise 中 PowerShell 自动完成的行为有点令人困惑,因为如果可用版本很少并且功能从最新版本中删除,它会显示相同功能的重复项,可能很快就会更改或以某种方式可配置。

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

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

您可以执行 Get-module MyModule -ListAvailable 并打印完整模块路径以检查它们的安装方式吗?

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

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

Import-Module 还支持 -MimimumVersion 和 RequiredVersion。

由于您在使用常规 Import-Module 时遇到问题,我怀疑它的结构和 PSModulePath 有问题。

也许 $PSModulePath 与每个新升级的 "version" 路径连接在一起,而不是像往常一样更新它?在这种情况下; "first" 版本可能是加载的版本,获得了另一个版本的存在规则。我也会快速检查一下 $PSModulePath 中的内容。

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

安装 modules/working 模块的一些链接:

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

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

希望对您有所帮助:)