Setting a Property Value in 1 task and use the updated value in another

1k views Asked by At

In my psake build script, I have a property called $build_mode that I set to "Release".

I have 2 tasks; "Compile_Debug", "Compile_Release". In Compile_Debug, I change $build_mode to "Debug" and it works fine while that task executes; however, if I have a have another task execute that uses $build_mode afterwards, $build_mode is back to "Release".

Is there a way to globally change or set a variable in a Psake build script so that an updated value can be used between tasks?

(I'm trying to have 1 "test" or 1 "package" task instead of a "Test_Debug", etc.)

Code:

properties {
    $build_mode = "Release"
}

task default -depends Compile_Debug, Test

task Compile_Debug {
    $build_mode = "Debug"
    # Compilation tasks here that use the Debug value
}

task Test {
        # Test related tasks that depend on $build_mode being updated.
}
2

There are 2 answers

0
manojlds On BEST ANSWER

Why don't you pass the build mode as parameter to the tasks from the Invoke-Psake?

 Invoke-Psake "$PSScriptRoot\Deploy\Deploy.Tasks.ps1" `
        -framework $conventions.framework `
        -taskList $tasks `
        -parameters @{
                "build_mode" = "Debug"
            }

And in the tasks you can now use $build_mode

1
Pedro On

I usually set the build mode as @manojlds suggested, passing in as a paramenter in the Invoke-Psake call. But, if you find yourself again in a situation that you want to modify the value of a object in Task A and have access to the modified value in Task B, here is how to do it:

The fact that the modified value of $build_mode is not accessible in Task B is due to powershell scoping. When you set a value for the $buildMode variable in a Task A, that change is made within Task A's scope, therefore outside it the variable value keeps unchanged.

One way to achieve what you want is to use a hashtable scoped to the whole script to store your objects:

Code:

properties {
    #initializes your global hash
    $script:hash = @{}
    $script:hash.build_mode = "Release"
}

task default -depends Compile_Debug, Test

task Compile_Debug {
    $script:hash.build_mode = "Debug"
    # Compilation tasks here that use the Debug value
}

task Test {
        # Test related tasks that depend on $script:hash.build_mode being updated.
}

The only caveat is that every time you want to refer to your build mode you have to use the long $script:hash.build_mode name instead of simply $build_mode