从PowerShell使用NuGet .NET包真的很麻烦吗?

时间:2018-08-22 02:04:39

标签: .net powershell google-api nuget-package google-api-dotnet-client

我一直在探索如何使用PowerShell中的Google API。

  1. 确保nuget.org是可信任的软件包源

    Register-PackageSource -name nuget.org -Location https://www.nuget.org/api/v2 -Provider NuGet -Trusted                               
    
  2. 安装.NET api软件包:

    $googlePackages= @(
        'Google.Apis'
        'Google.Apis.Core'
        'Google.Apis.Discovery.v1'
    )
    Install-Package -Name $googlePackages
    
  3. 在您的实际脚本中,Add-Type用于您需要使用的每个程序包的每个程序集。这是很烦人的部分。

    程序包包含用于不同平台的程序集。 Add-Type需要传递正确版本的程序集。下面的功能Add-PackageAssemblies试图对此进行封装。

    Add-Type将由于缺少类型而失败。通过反复试验,可以找到需要Add-Type d组装的其他软件包。

    function Add-PackageTypes {
        Param (
            [Parameter(ValueFromPipeline=$true)]
            [Microsoft.PackageManagement.Packaging.SoftwareIdentity] 
            $package
            ,
            $assemblyFilter = "*netstandard2.0*.dll"
        )
        Process {
            $assemblies = get-childitem -path ($package.Source | Split-Path -Parent) -Recurse |
                Where-Object {$_.FullName -like $assemblyFilter } |
                Select-Object -ExpandProperty FullName
            try {
                $newTypes = Add-Type -AssemblyName $assemblies -passthru
            } catch [System.Reflection.ReflectionTypeLoadException] {
                Write-Error "Message: $($_.Exception.Message)"
                Write-Error "LoaderExceptions: $($_.Exception.LoaderExceptions)"
            }
            Write-Output $newTypes
        }
    }
    
    $types = Get-Package $googlePackages | Add-PackageTypes
    

    最好避免反复试验,并使用包属性查找和加载其他必需的类型。

  4. 最后,实际使用API​​:

    $serviceInitializer = New-Object Google.Apis.Services.BaseClientService+Initializer
    $serviceInitializer.ApiKey = Get-MySecretGoogleAPIKey
    $serviceInitializer.ApplicationName = "DiscoverySamplePowershellApplication"
    $discoveryService = New-Object Google.Apis.Discovery.v1.DiscoveryService -ArgumentList $serviceInitializer
    $results = $discoveryService.apis.List().Execute()
    
    Write-Output $results.items
    

有没有更简单的方法?是否已经有解决这些问题的知名模块?

0 个答案:

没有答案