繁体   English   中英

如何同时安装Powershell模块?

[英]How to install a Powershell module concurrently?

我有一个针对不同分支运行的请求请求验证构建,即该构建的多个并发实例是很常见的事情。

构建所做的一件事是安装模块。 现在,我可以在构建代理上修改配置文件并从那里安装模块,但是我想避免任何额外的构建代理配置。 因此,我的构建在当前用户范围内安装了一个模块。

我注意到,并发调用Install-Module似乎并不安全-它可能会因各种不同而奇怪的错误消息而失败。

现在,我使用在获取之前和之后释放的命名互斥体来解决此问题,但这会导致糟糕的性能-代码有时需要等待30秒或更长时间。 那么,如何解决这个问题呢? 如何同时安全且性能良好地同时安装Powershell模块?

编辑1

真令人沮丧。 我正在尝试使用Set-PSDebug -Trace 2跟踪并发安装,但是显然Install-Module有很多Write-Debug调用,这些调用本身对并发执行并不安全! 因此,试图追踪实际上会使事情变得更糟。

显然,在同一代理上运行多个构建的构建期间, Install-Module完全不安全 看起来使用命名的Mutex是最安全的方法。

编辑1

在多线程环境中,如果没有显式互斥锁,则调用以下命令并不安全:

  • Install-Module
  • Import-Module
  • 没有参数的Get-PSRepository

也许更多。 在我的代码中,我调用了所有三个命令,并且发现所有这些命令必须一起放在同一互斥锁中,即这些组合不起作用:

无法运作#1

$mtx.WaitOne()
try
{
    Install-Module ...
}
finally
{
    $mtx.ReleaseMutex()
}
Import-Module ...
Get-PSRepository ...

不工作#2

$mtx.WaitOne()
try
{
    Install-Module ...
    Import-Module ...
}
finally
{
    $mtx.ReleaseMutex()
}
Get-PSRepository

唯一安全的选择似乎是这样的:

$mtx.WaitOne()
try
{
    Install-Module ...
    Import-Module ...
    Get-PSRepository
}
finally
{
    $mtx.ReleaseMutex()
}

令人惊讶的是,因为我不希望Install-ModuleImport-Module会影响Get-PSRepository ,但是它们却以某种方式Get-PSRepository

   ParameterBindingException: A parameter cannot be found that matches parameter name 'Provider'.
   at Get-PSRepository<Process>, C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1: line 4496
   at Use-ModuleFB22C60E, C:\Users\mkharitonov\AppData\Local\Temp\fb22c60e-a0c5-48b3-953a-0b580c6a2f5e\m_deadbeef_.ps1: line 167
   at <ScriptBlock>, <No file>: line 4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM