Рабочий процесс не учитывает переменную filepath, определенную в функции - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь использовать Workflow для параллельного запуска двух функций. Этот сценарий обращается к моему репозиторию пакетов Nuget, получает версию и затем вставляет эти номера версий в URL-адрес загрузки. Я хочу установить каталог $, чтобы я мог легко изменить путь к файлу. При выполнении следующего задания работают правильно параллельно, но они развертывают папки в C: \ вместо C: \ Temp. Если я определяю путь как его буквальный путь, он работает нормально, а если я просто выполняю функции без рабочего процесса, он работает нормально. Есть мысли?

$directory = 'C:\Temp'

function getPackage1 {
    param ()
    $api = 'http://localhost/nuget/PackageName/Packages()?$format=json&$filter=id%20eq%20%27Package.Dotnet%27%20&$select=Version'
    $responses = (Invoke-RestMethod $api).d.results.Version
    foreach($response in $responses)
        {
            Invoke-WebRequest http://localhost/nuget/PackageName/package/Package.Dotnet/$response -OutFile (New-Item "$($directory)\package\$response.nupkg" -Force)
        }
}

function getPackage2 {
    param ()
    $api = 'http://localhost/nuget/PackageName2/Packages()?$format=json&$filter=id%20eq%20%27Package.Dotnet2%27%20&$select=Version'
    $responses = (Invoke-RestMethod $api).d.results.Version
    foreach($response in $responses)
        {
            Invoke-WebRequest http://localhost/nuget/PackageName2/package/Package.Dotnet/$response -OutFile (New-Item "$($directory)\package2\$response.nupkg" -Force)
        }
}

workflow getAllPackages {
    param ()
    parallel {
        getPackage1
        getPackage2
    }  
}

try { getAllPackages }
catch {'An unspecifed error occurred while downloading the files'}

1 Ответ

0 голосов
/ 23 марта 2020

Рабочие процессы ужасны для "ускорения" вещей, см. Ниже


Вам необходимо явно передать весь ввод в рабочий процесс!

Рабочие процессы разработаны выполнять отдельно от вызывающего процесса, и по этой причине команды и входные значения сериализуются (в основном превращаются в XML) перед выполнением.

Поэтому вы должны явно передать все, на что есть ссылки в рабочем процессе, в качестве параметров, у него не будет прямого доступа к вызывающей области во время выполнения:

function getPackage1 {
    param($directory)
    # ...
}

function getPackage2 {
    param($directory)
    #...
}

workflow getAllPackages {
    param($directory)
    parallel {
        getPackage1 $directory
        getPackage2 $directory
    }  
}

try { getAllPackages $PWD.Path } catch { <# ... #> }

Как намекает первый заголовок рабочие процессы довольно медленные (и сложные), поэтому, если вы просто пытаетесь ускорить загрузку всех файлов, вы можете просто разложить запросы к новым процессам с помощью Start-Job:

function Get-PackageVersions
{
    param ([string]$Destination)

    $api = 'http://localhost/nuget/PackageName/Packages()?$format=json&$filter=id%20eq%20%27Package.Dotnet%27%20&$select=Version'

    $responses = (Invoke-RestMethod $api).d.results.Version

    $Jobs = foreach($response in $responses)
    {
        Start-Job { Invoke-WebRequest http://localhost/nuget/PackageName/package/Package.Dotnet/$using:response -OutFile (New-Item "$($using:Destination)\package\$using:response.nupkg" -Force) }
    }

    # Wait 30 seconds for jobs to complete
    $completedJobs = $Jobs |Wait-Job -Timeout 30
    $Jobs |Remove-Job 
    if(-not $completedJobs){
        throw "Did not finish downloading all $($Jobs.Count) versions in time"
    }

}

Затем передайте свой аргумент как:

$directory = "C:\target\folder"
Get-PackageVersions $directory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...