2010-02-06 5 views
2

Je dois construire un script MSBUILD qui exécute les scripts .SQL qui ont été modifiés depuis la dernière génération.MSBUILD Exécution de scripts SQL modifiés uniquement

J'ai d'abord pensé que je pouvais copier tous les scripts d'un dossier à l'autre en utilisant la tâche <Copy> et en utilisant les CopiedFiles <Output> pour la tâche de copie. Cependant, la tâche de copie renvoie Tous les fichiers qu'elle a tenté de copier, et non les fichiers copiés.

Je suis en mesure d'obtenir MSBUILD d'exécuter des scripts SQL via MSBUILD.ExtensionPack mais Im me gratter la tête sur celui-ci

+0

il semble que certains de mon texte a été interprété comme balises, deuxième paragraphe: Je pensais d'abord que je pouvais copier tous les scripts de un dossier à l'autre en utilisant la tâche COPY et en utilisant CopiedFiles OUTPUT pour la tâche de copie. Cependant, la tâche de copie renvoie Tous les fichiers qu'elle a tenté de copier, et non les fichiers copiés. – imbz

Répondre

3

Vous pouvez le faire avec un concept connu sous le nom de construction incrémentielle. L'idée est que vous créiez une cible, puis spécifiez les entrées et les sorties, qui seraient des fichiers. MSBuild compare les horodatages des fichiers d'entrée aux fichiers de sortie. Si toutes les sorties ont été créées après toutes les sorties, la cible est ignorée. Si toutes les entrées sont plus récentes, toutes les cibles seront exécutées pour tous les fichiers. Si seulement une partie est périmée, alors seulement celles-ci seront passées à la cible. Pour plus d'informations à ce sujet, voir la section Utilisation de constructions incrémentielles dans mon article Best Practices For Creating Reliable Builds, Part 2.

également plus de ressources sur MSBuild j'ai compilé une liste à http://sedotech.com/Resources#MSBuild

+0

Merci, c'était exactement ce que je cherchais. – imbz

+0

Ouais, merci, trié mon problème aussi :) – Mark

0

pourrait-il que vous copier dans une destination vide?

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. 

Dans votre cas je pense que tous les fichiers sont considérés comme modifiés car ils n'existent pas à la destination.

+1

Non, la tâche de copie signale tous les fichiers copiés tentés et pas seulement les fichiers copiés. C'est un problème connu que j'ai vu en recherchant les interwebs. – imbz

+0

@imbz - Dang il! Tu as raison - je n'ai jamais entendu parler de ce bug stupide avant. – Filburt

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> 
+0

Ceci est surtout comment résoudre le problème avec Data Dude. Ce serait bien que MS fournisse cette tâche "prête à l'emploi". – Raffaeu

Questions connexes