如何在PowerShell中使用Invoke build创建动态生成任务

如何在PowerShell中使用Invoke build创建动态生成任务,powershell,build,build-process,psake,invoke-build,Powershell,Build,Build Process,Psake,Invoke Build,使用Invoke Build我正在尝试创建动态构建任务,下面是该方法的一个示例。其中,与经典的UNIX make工具类似,如果输入文件比输出文件新,则将为每个输入文件生成一个输出文件 它通过动态生成一组增量任务,然后调用这些任务来实现这一点 增量任务的生成概述如下: $Jobs = Foreach($_ in $Conf ) { $SourceFile = Get-Item $_ $FileName = $SourceFile.Name $

使用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脚本,调用BuildBuild都会抱怨BuildThing未被识别为:

cmdlet、函数、脚本文件或可操作程序的名称

如果我在运行Invoke-Build之前点源相关文件,那么一切都会按预期工作

这似乎是一个范围问题——但不清楚如何以直接的方式解决它


如果我试图以静态方式将BuildThing.ps1包含在循环之外,它看起来确实被调用了,正如调试所确认的那样,但似乎不在动态任务要执行的范围内。

关于上述内容,适当的方法似乎是修改$TaskCode的定义以点源文件

如果我们假设.\BuildThing.ps1包含一个函数-例如

function BuildThing {
param(...)
...
}
然后动态任务代码需要点源代码。对于大量类似的构建任务来说,这似乎效率低下,但是它确实解决了这个问题

$TaskCode = @'
. .\BuildThing.ps1
BuildThing -MetaData $MetaData
'@

问题在于
BuildThing
。两个问题。1)
BuildThing.ps1
的位置是什么?2)
$TaskCode
第二行的
BuildThing
命令是什么(可能找不到)?应该是
\BuildThing.ps1-MetaData…
?另外,完整/准确的错误消息是什么?它是否包含发生错误的代码行的提示?另外,尝试检查变量
$Error
的内容。它包含了所有的错误,有时它提供了更多的信息。我认为单引号是可以的。如果我最初点源代码。\BuildGetter.ps1,它定义了我想要使用的函数,然后调用在单引号情况下运行良好的构建;不在双引号的情况下。在这种情况下,我也不需要在“$TaskCode=”赋值中使用。\BuildGetter,ps1。另一方面,如果我使用双引号,那么我认为在构建闭包时$MakeGetter没有被正确捕获。坦白地说,我甚至不确定那是对的!在这里公开学习!BuildGetter.ps1定义了一个func。它接受一个哈希表并输出一个文件。2)它不应该是。\BuildThing.ps1-Metadata-。\BuildThing.ps1只是定义了函数BuildThing。是的,我已经意识到单引号是可以的,您正在使用闭包。这是一个棘手的案件,我还没有足够的信息,我没有看到整个画面。尽量准确地获取所有细节,包括所有错误。关于原始代码的注释。我认为这样做可以:
$SBInputs=$SourceFile.FullName
$SBOutputs=
而不是使用昂贵的闭包创建脚本块。