【问题标题】:Optionally pass argument to MSBuild from powershell可选地将参数从 powershell 传递给 MSBuild
【发布时间】:2014-07-22 14:45:53
【问题描述】:

在我的 Build.proj 文件中,我有以下属性:

<DbName Condition="$(DbName) == ''">MyDB</DbName>
<ConnectionString Condition="$(ConnectionString) == ''">"Data Source=localhost;Initial Catalog=$(DbName);Integrated Security=SSPI;MultipleActiveResultSets=True"</ConnectionString>

我有一个PowerShell函数如下:

function Update-Database
{
    param(
        $DbName=""
    )
    msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate /p:DbName=$DbName
}

在 PowerShell 中运行函数我得到以下结果:

  • Update-Database MyDB:完美运行
  • Update-Database:失败。在这种情况下,MSBuild 不使用默认的“MyDB”。相反,它使用 ''

如果我修改这一行:

msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate /p:DbName=$DbName

到这里:

msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate

运行“UpdateDatabase”使用默认的“MyDB”,一切正常。

如果我想选择使用默认值或传入新值,是否必须将整个 msbuild... 命令包装在 if else 中?或者有没有办法有条件地传入参数?

更新

我试图避免在 ps 函数中设置默认值。基本上我想在没有 if 的情况下模拟这种行为:

function Update-Database
{
    param(
        $DbName=""
    )
    if($DbName -eq "")
    {
        msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate
    }
    else
    {
        msbuild  $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate /p:DbName=$DbName
    }
}

【问题讨论】:

  • 你必须混合它们吗?例如,为什么您不能在 Update-Database 中定义 $DBName='MyDB'?
  • 您的脚本现在按设计运行。如果 dbname 为空,您希望它忽略 msbuild 上的那个开关。对吗?
  • 您希望默认始终为 MyDB 吗?在这种情况下,您只需将$DbName="" 行更改为$DbName="MyDB",如果没有传递参数,则将使用该行
  • 我试图避免在 ps 函数中设置默认值。请参阅上面的更新部分。

标签: powershell msbuild


【解决方案1】:

您在命令行中指定的属性变为global property,它将优先于文件中指定的属性。您可以定义一个新属性来避免这种行为,如下所示:

<_DbName>$(DbName)</DbName>
<_DbName Condition="$(_DbName) == ''">MyDB</_DbName>
<ConnectionString Condition="$(ConnectionString) == ''">"Data Source=localhost;Initial Catalog=$(_DbName);Integrated Security=SSPI;MultipleActiveResultSets=True"</ConnectionString>

【讨论】:

    【解决方案2】:

    虽然已经确定了一个很好的答案,但另一种方法是在 powershell 中使用 Invoke-Expression 并动态构建您要运行的 msbuild cmd。我在 GitHub 上有一个示例(您可以轻松更改它以适应可选的数据库名称:

    https://gist.github.com/nnieslan/c631add56c5f7f3e7d6e#file-build-functions-ps1

    【讨论】:

    • 不错!这将在未来派上用场。谢谢
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多