gpt4 book ai didi

powershell - 如何使 Install-Module 也安装任何必需的模块?

转载 作者:行者123 更新时间:2023-12-02 23:00:59 27 4
gpt4 key购买 nike

我正在开发一个依赖于 SqlServer 的 PS 模块。

这是模块 list 文件:

@{
ModuleVersion = "1.0.19103.11"
GUID = "59bc8fa6-b480-4226-9bcc-ec243102f3cc"
Author = "..."
CompanyName = "..."
Copyright = "..."
Description = "..."
RequiredModules = ""
ScriptsToProcess = "vsts\config.ps1"
NestedModules = @( ... )
PrivateData = @{
PSData = @{
ExternalModuleDependencies = @(
"SqlServer"
)
}
}
}

以下是我用来发布模块的命令:
if (Get-PSRepository $PSRepositoryName -ErrorAction SilentlyContinue)
{
Unregister-PSRepository $PSRepositoryName
}
Register-PSRepository $PSRepositoryName `
-SourceLocation $NuGetRepoUrl `
-PublishLocation $NuGetRepoUrl `
-InstallationPolicy Trusted `
-PackageManagementProvider nuget

Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force

问题是,当我安装此模块时,我收到以下警告:
WARNING: The externally managed, dependent module 'SqlServer' is not installed on this computer. To use the current module 'xyz.PS.Core', ensure that its dependent
module 'SqlServer' is installed.

安装此软件包时,如何在没有任何警告的情况下自动安装 SqlServer。

我尝试设置 RequiredModules属性,但是如果构建机器没有安装模块 SqlServer,则首先无法发布模块。我可以在那里安装它,但是有没有更好的方法而不强制我们在构建代理上安装包?

编辑 1

因此,我在构建代理上安装了 SqlServer 模块并添加了 RequiredModules属性(property)。显示相同的警告。但现在我什至无法导入模块:
Import-Module : The required module 'SqlServer' is not loaded. Load the module or remove the module from 'RequiredModules' in the file

编辑 2

我仍然无法使其工作。让我展示所有的组合。在所有情况下,测试机都会执行 不是 在其上安装 SqlServer 模块。

尝试 1
RequiredModules = @(
@{
ModuleName = "SqlServer"
ModuleVersion = "21.1.18068"
}
)
PrivateData = @{
PSData = @{
ExternalModuleDependencies = "SqlServer"
}
}

产量
C:\> Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force
PowerShellGet cannot resolve the module dependency 'SqlServer' of the module 'xyz.PS.Core' on the repository 'xyz-QA'. Verify that the dependent module 'SqlServer' is available in the repository 'xyz-QA'. If this dependent module 'SqlServer' is managed externally, add it to the ExternalModuleDependencies entry in the PSData section of the module manifest.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1227 char:17
+ Publish-PSArtifactUtility -PSModuleInfo $moduleInfo `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Publish-PSArtifactUtility], InvalidOperationException
+ FullyQualifiedErrorId : UnableToResolveModuleDependency,Publish-PSArtifactUtility
C:\>

尝试 2
RequiredModules = @("SqlServer")
PrivateData = @{
PSData = @{
ExternalModuleDependencies = "SqlServer"
}
}

产量
C:\> Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force
PowerShellGet cannot resolve the module dependency 'SqlServer' of the module 'xyz.PS.Core' on the repository 'xyz-QA'. Verify that the dependent module 'SqlServer' is available in the repository 'xyz-QA'. If this dependent module 'SqlServer' is managed externally, add it to the ExternalModuleDependencies entry in the PSData section of the module manifest.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1227 char:17
+ Publish-PSArtifactUtility -PSModuleInfo $moduleInfo `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Publish-PSArtifactUtility], InvalidOperationException
+ FullyQualifiedErrorId : UnableToResolveModuleDependency,Publish-PSArtifactUtility
C:\>

尝试 3
PrivateData = @{
PSData = @{
ExternalModuleDependencies = "SqlServer"
}
}

(没有 RequiredModules )产量:
C:\> Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force
C:\> Get-Module SqlServer -ListAvailable
C:\> Install-Module xyz.PS.Core -Scope CurrentUser -Force -AllowClobber
WARNING: The externally managed, dependent module 'SqlServer' is not installed on this computer. To use the current module 'xyz.PS.Core', ensure that its dependent module 'SqlServer' is installed.
C:\> Get-Module SqlServer -ListAvailable
C:\>

如您所见,发布成功,但安装模块输出警告。并且没有安装 SqlServer。

尝试 4
RequiredModules = @(
@{
ModuleName = "SqlServer"
ModuleVersion = "21.1.18068"
}
)

(没有 ExternalModuleDependencies)产量:
C:\> Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force
The specified RequiredModules entry 'SqlServer' in the module manifest 'C:\Users\mkharitonov\AppData\Local\Temp\2144858157\xyz.PS.Core\xyz.PS.Core.psd1' is invalid. Try again after updating this entry with valid values.At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1144 char:27+ ... oduleInfo = Microsoft.PowerShell.Core\Test-ModuleManifest -Path $mani ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\mkhari...ce.PS.Core.psd1:String) [Test-ModuleManifest], DirectoryNotFoundException
+ FullyQualifiedErrorId : Modules_InvalidRequiredModulesinModuleManifest,Microsoft.PowerShell.Commands.TestModuleManifestCommand
C:\>

尝试 5
RequiredModules = @("SqlServer")

(没有 ExternalModuleDependencies)产量:
C:\> Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force
The specified RequiredModules entry 'SqlServer' in the module manifest 'C:\Users\mkharitonov\AppData\Local\Temp\1208648280\xyz.PS.Core\xyz.PS.Core.psd1' is invalid. Try again after updating this entry with valid values.At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1144 char:27+ ... oduleInfo = Microsoft.PowerShell.Core\Test-ModuleManifest -Path $mani ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\mkhari...ce.PS.Core.psd1:String) [Test-ModuleManifest], DirectoryNotFoundException
+ FullyQualifiedErrorId : Modules_InvalidRequiredModulesinModuleManifest,Microsoft.PowerShell.Commands.TestModuleManifestCommand
C:\>

所以,我所做的一切都不起作用。到目前为止,Powershell 似乎无法安装所需的模块。

我究竟做错了什么?

编辑 3

即使我在构建机器上安装了 SqlServer,RequiredModules 属性也不起作用。观察:
RequiredModules = @(
"SqlServer"
)
PrivateData = @{
PSData = @{
ExternalModuleDependencies = "SqlServer"
}
}

结果是:
C:\> Get-Module SqlServer -ListAvailable


Directory: C:\Users\mkharitonov\Documents\WindowsPowerShell\Modules


ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 21.1.18102 SqlServer {Add-RoleMember, Add-SqlAvailabilityDatabase, Add-SqlAvailabilityGroupListenerStaticIp, Ad...


C:\> Publish-Module -Name $ModuleManifestFile -NuGetApiKey $NuGetApiKey -Repository $PSRepositoryName -Force
PowerShellGet cannot resolve the module dependency 'SqlServer' of the module 'xyz.PS.Core' on the repository 'xyz-QA'. Verify that the dependent module 'SqlServer' is available in the repository 'xyz-QA'. If this dependent module 'SqlServer' is managed externally, add it to the ExternalModuleDependencies entry in the PSData section of the module manifest.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1227 char:17
+ Publish-PSArtifactUtility -PSModuleInfo $moduleInfo `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Publish-PSArtifactUtility], InvalidOperationException
+ FullyQualifiedErrorId : UnableToResolveModuleDependency,Publish-PSArtifactUtility
C:\>

Powershell 似乎在我的存储库中而不是在 PSGallery 中寻找 SqlServer 模块。我不明白的方式。以下是机器上注册的 PS 存储库:
C:\> Get-PSRepository

Name InstallationPolicy SourceLocation
---- ------------------ --------------
PSGallery Trusted https://www.powershellgallery.com/api/v2
xyz-QA Trusted http://devstatic.xyz.com/nugetserver/nuget


C:\>

所以,我真的不明白我该怎么做?

最佳答案

注意:以下内容来自 this discussion in the PackageManagement (OneGet) GitHub repo ,特别是 this comment来自团队成员:

Install-Module works for dependences within the same repo.
For dependency modules are hosted on the repo different from that module to be installed, I recommend you to publish them to your house repo.
If you do not wish to publish them into your house repo, you may save modules to your common file share, Register-PSRepository -Name local -SourceLocation \server\commonshare, then install these modules from file share first."



截至 PackageManagement module版本 1.3,我从您的症状中得出结论,即使评论来自 2017 年中期(我找不到任何官方文档),上述仍然适用。

总结一下:
  • 自动安装不支持跨存储库依赖 ; 解决方法是将外部依赖项也发布到您的内部仓库 .
  • 调用 Publish-Module ,看来, RequiredModules 中列出的模块条目必须存在于同一目标仓库中 .
  • 也就是说,仅在您的机器上存在此类模块是不够的。 (我不清楚他们是否也需要在场——他们不应该在场。)
  • 为了支持自动安装存储库内依赖项,PrivateData.PSData.ExternalModuleDependencies条目也必须列出这些依赖项 - 除了 RequiredModules - 仅按名称 - 见下文。

  • 为自动依赖安装指定存储库内模块依赖(未验证) :
    # Specify what other modules this module requires to work, using a FQMN,
    # (a Fully Qualified Module Name), via a hashtable.
    # The 'ModuleVersion' entry version numbers specifies a *minimum* required version
    # number; 'RequiredVersion' specifies an *exact* version, and
    # 'MaximumVersion' specifies a maximum version.
    # IMPORTANT:
    # If you publish a module whose manifest has a 'RequiredModules'
    # entry to a repository with Publish-Module, all referenced modules
    # seemingly *must exist in that repository.*
    RequiredModules = @( @{ModuleName = 'SqlServer'; ModuleVersion = '21.1.18068' } )


    PrivateData = @{
    PSData = @{

    # ...

    # !! This field is *ancillary* to the more detailed 'RequiredModules' field and
    # !! must reference the *same modules*, but by *names only*,
    # !! in order to automatically install other modules
    # !! *from the same repository* that this module depends on.
    # !! To be safe, specify even a *single* name as an *array*
    # !! (While this is not a general requirement in manifests,
    # !! it may be necessary here due to a bug.)
    ExternalModuleDependencies = @('SqlServer')
    }

    顺便说一句: New-ModuleManifest 中的一个错误当前阻止直接创建 PrivateData.PSData.ExternalModuleDependencies入口:
    # !! BROKEN as of Windows PowerShell v5.1 / PowerShell Core 6.2.0;
    # The inner hashtable ends up represented as 'System.Collections.Hashtable'
    New-ModuleManifest someManifest.psd1 -PrivateData @{
    PSData = @{
    ExternalModuleDependencies = @('SqlServer')
    }
    }

    this GitHub issue .

    关于powershell - 如何使 Install-Module 也安装任何必需的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55668072/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com