Invoke-Build を使用して動的ビルド タスクを作成しようとしています。アプローチの例を以下に示します。従来の UNIX の make 機能と同様の方法で、入力ファイルが出力ファイルより新しい場合は、入力ファイルごとに出力ファイルが生成されます。
これは、一連の増分タスクを動的に生成し、タスクを呼び出すことによって実現されます。
増分タスクの生成の概要を以下に示します。
$Jobs = Foreach($_ in $Conf ) {
$SourceFile = Get-Item $_
$FileName = $SourceFile.Name
$ObjectName = $FileName -replace '^Thing-(.*)\.conf\.ps1$','$1'
$TaskName = "Task-$ObjectName"
$OutFile = "Thing-$ObjectName.ps1"
# Import the script, overwriting the "$MetaData" variable
$MetaData = . $SourceFile
$TaskCode = @'
.\BuildThing.ps1
BuildThing -MetaData $MetaData
'@
Write-Verbose "$SourceFile $OutFile"
$SBInputs = [scriptblock]::Create( { $SourceFile } ).GetNewClosure()
$SBOutputs = [scriptblock]::Create( { $OutFile } ).GetNewClosure()
$SBMain = [scriptblock]::Create($TaskCode).GetNewClosure()
Task "$TaskName" -Inputs $SBInputs -Outputs $SBOutputs ($SBMain)
Write-Output $TaskName
}
これは、必要な他の機能のスコープとは別に、うまく機能しているように見えます。タスク Task-Thing- が実行されたときに BuildThing.ps1 スクリプトをどこでソースしようとしても、Invoke-Build は BuildThing が次のように認識されないと文句を言います。
「コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前。」
Invoke-Build を実行する前に関連ファイルをドットソースすると、すべてが期待どおりに機能します。
これはスコーピングの問題のように思えますが、単純な方法で解決する方法は明確ではありません。
静的な方法で BuildThing.ps1 をループの外に含めようとすると、デバッグによって確認されたように呼び出されたように見えますが、動的タスクによって実行される範囲には含まれていないようです。