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

时间:2015-12-09 15:31:13

标签: powershell nuget nuget-spec oneget powershellget

我正在使用PowerShellGet从我当地的Nuget Feed安装我自己的PowerShell模块(打包并发布为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自动完成显示每个功能的重复项:

example in 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
  5. 对我而言:

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

    结论

    似乎这里没有问题,因为@CmdrTchort写道,预计Get-Module -ListAvailable显示所有已安装的版本。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

您是否更新了每个版本的Module-manifest并将其捆绑在新文件夹中?

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

Import-Module还支持-MimimumVersion og RequiredVersion。

当您在常规导入模块中遇到问题时,我怀疑它的结构和PSModulePath是如何混乱的。

也许$ PSModulePath与"版本"每次新升级的路径,而不是像往常一样更新它?在这种情况下; "第一"版本可能是加载的版本,将presedence规则放在另一个上面。我也会快速查看$ PSModulePath中的内容。

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

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

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

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

希望这会有所帮助:)