【问题标题】:Why Msbuild task failed to deploy database, but Exec work fine为什么 Msbuild 任务无法部署数据库,但 Exec 工作正常
【发布时间】:2012-03-31 19:05:52
【问题描述】:

我正在尝试在自动构建服务器处理中部署数据库项目( dbproj 格式,而不是新的 SSDT sqlproj )。我发现了以下内容:

当我在我的 Msbuild 脚本中使用 Exec 任务调用部署时 - 一切正常:

<Exec Command="$(MSBuildPath)\MSBuild.exe $(SourceFilesPath)\$(DeployDatabaseProjectName)\$(DeployDatabaseProjectName).dbproj 
/t:Deploy 
/p:OutputPath=$(BaseOutput)\$(DeployDatabaseProjectName)\ 
/p:TargetDatabase=$(DeployDatabaseName)
/p:TargetConnectionString=$(DeployDatabaseConnectionString)" />

但是当我尝试使用 Msbuild 任务重复此操作时 - 它的行为不同:

<MSBuild Projects="$(SourceFilesPath)\$(DeployDatabaseProjectName)\$(DeployDatabaseProjectName).dbproj" 
            Targets="Deploy"
            Properties="Configuration=$(BuildConfiguration);
            TargetDatabase=$(DeployDatabaseName);
            TargetConnectionString=&quot;$(DeployDatabaseConnectionString)&quot;;
            OutputPath=$(BaseOutput)\$(DeployDatabaseProjectName)\;
            " />

Msbuild 任务在 DeployDatabaseConnectionString 中的分号处中断:

<DeployDatabaseConnectionString>Data Source=$(DeployDatabaseServer);Integrated Security=True;Pooling=False</DeployDatabaseConnectionString>

它会报告如下内容:

名称“Integrated Security”包含无效字符“ ”

但是如果我用百分比编码值替换分号 - %3B - 它会在 SqlDeployTask 内部中断:

错误 MSB4018:“SqlDeployTask”任务意外失败。

将 TargetConnectionString 传递给 SqlProject 的部署目标的正确方法是什么?

PS:我可以接受 exec 任务,但在 msbuild 脚本中调用 msbuild.exe 只会伤害我内心的完美主义者。

【问题讨论】:

    标签: deployment msbuild database-project


    【解决方案1】:

    我找到了正确的方法——新的 Msbuild 允许在项目上定义 AdditionalProperties 元数据。所以有了这个功能,一切正常,转义\编码没有问题

    <ItemGroup>
        <DbProjectToBuild Include="$(SourceFilesPath)\$(DeployDatabaseProjectName)\$(DeployDatabaseProjectName).dbproj">
            <AdditionalProperties>Configuration=$(BuildConfiguration)</AdditionalProperties>
            <AdditionalProperties>OutputPath=$(BaseOutput)\$(DeployDatabaseProjectName)\</AdditionalProperties>
            <AdditionalProperties>TargetDatabase=$(DeployDatabaseName)</AdditionalProperties>
            <AdditionalProperties>TargetConnectionString="Data Source=$(DeployDatabaseServer);Integrated Security=True;Pooling=False"</AdditionalProperties>
        </DbProjectToBuild>
    </ItemGroup>        
    <MSBuild Projects="%(DbProjectToBuild.Identity)" Targets="Build;Deploy" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多