MSBUILD仅执行更改的SQL脚本

时间:2010-02-06 01:45:18

标签: msbuild

我需要构建一个MSBUILD脚本,执行自上次构建以来发生过变化的.SQL脚本。

我最初认为我可以使用<Copy>任务将所有脚本从一个文件夹复制到另一个文件夹,并使用CopiedFiles <Output>复制任务。但是,复制任务将返回它尝试复制的所有文件,而不是实际复制的文件。

我能够让MSBUILD通过MSBUILD.ExtensionPack执行SQL脚本,但是我在这个问题上摸不着头脑

3 个答案:

答案 0 :(得分:3)

您可以使用称为增量构建的概念来执行此操作。这个想法是你要创建一个目标,然后指定输入和输出,这将是文件。 MSBuild将比较输入文件的时间戳与输出文件。如果在所有输出之后创建了所有输出,则跳过目标。如果所有输入都较新,则将对所有文件执行所有目标。如果只有一部分过时,那么只有那些将被传递给目标。有关详细信息,请参阅我的文章Best Practices For Creating Reliable Builds, Part 2中的 使用增量构建 部分。

另外,对于MSBuild上的更多资源,我已在http://sedotech.com/Resources#MSBuild

编译了一个列表

答案 1 :(得分:3)

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="RunScripts">

  <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks"/>

  <PropertyGroup>
    <ConnStr>Server=Example;Database=Example;Trusted_Connection=True</ConnStr>
    <BuildFolder>Build\</BuildFolder>
  </PropertyGroup>

  <ItemGroup>
    <Scripts Include="*.sql"/>
  </ItemGroup>

  <Target Name="RunScripts"
          Inputs="@(Scripts)"
          Outputs="@(Scripts->'$(BuildFolder)%(Filename)%(Extension)')">
    <SqlExecute TaskAction="ExecuteScalar"
                Files="@(Scripts)"
                ConnectionString="$(ConnStr)"/>
    <Copy SourceFiles="@(Scripts)"
          DestinationFiles="@(Scripts->'$(BuildFolder)%(Filename)%(Extension)')"/>
  </Target>
</Project>

答案 2 :(得分:0)

您是否可以复制到空目的地?

<强> SkipUnchangedFiles

If true, skips the copying of files that are unchanged 
between the source and destination. The Copy task considers 
files to be unchanged if they have the same size and the 
same last modified time.

在您的情况下,我怀疑所有文件都被视为已更改,因为它们在目的地不存在。