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'".
查看,实际导入的是哪个版本:
- 启动新的
powershell
控制台
- 运行
Get-Module
确保完全不导入 MyModule
- 运行 来自 MyModule 的任何 cmdlet
- 检查一下,再次执行
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
希望对您有所帮助:)
我正在使用 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'".
查看,实际导入的是哪个版本:
- 启动新的
powershell
控制台 - 运行
Get-Module
确保完全不导入 MyModule - 运行 来自 MyModule 的任何 cmdlet
- 检查一下,再次执行
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
希望对您有所帮助:)