2010-12-14 53 views
0

J'ai une solution avec deux projets. L'un d'entre eux est un projet simple qui ne dépend d'aucun assemblage spécial à construire. Cependant, l'application est autorisée à lancer un exécutable externe (que je possède également - c'est le deuxième projet de ma solution). Quand je construis le projet, j'aimerais que l'exécutable (+ dépendances comme app.config) du projet externe soit copié sous le répertoire cible de mon projet. Comment puis-je y parvenir avec MsBuild?Copier des fichiers avec MsBuild

Ma première idée était d'ajouter une référence à l'exécutable (même si je n'en ai pas besoin de construire) pour copier le fichier. Cela me semble un peu hacky.

Merci!

P.S. Une autre question: Disons que je peux dire à MsBuild de copier l'exécutable. Que faire si l'exécutable n'est pas construit? Puis-je le forcer à construire?

Répondre

1

Avez-vous regardé la tâche de copie MSBuild: Copy Task?

3

Dans votre cas, vous devez faire votre script MSBuild remplacer votre solution et déclarer la dépendance il souhaité:

<Project DefaultTargets="Executable_A"> 
    <Target Name="Executable_A" DependsOnTargets="Executable_B"> 
     <MSBuild Projects="Executable_A.proj" Targets="Build" /> 
    </Target> 

    <Target Name="Executable_B"> 
     <MSBuild Projects="Executable_B.proj" Targets="Build"> 
      <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" /> 
     </MSBuild> 
     <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="C:\My_Target_Path\" SkipUnchangedFiles="true" /> 
    </Target> 
</Project> 

... et vous pouvez demander à la cible de votre deuxième projet pour copier sa sortie à l'désirée emplacement. Vous pouvez même demander à votre premier projet de stocker son chemin de sortie dans une variable à utiliser lors de la copie de la sortie de votre second projet (Dossier de destination).

+0

Eh Filburt, je viens d'essayer cette solution et c'est exactement ce que je cherche! Toutefois, le fichier app.config (et les autres dépendances) de l'exécutable_B n'est pas copié. Une idée pourquoi? – Martin

+0

@Martin hein ... Honnêtement, je devrais regarder ça moi-même. TargetOutputs récupère uniquement ce qui est réellement construit à partir du projet lui-même. Aussi, vous pouvez vouloir omettre le SkipUnchangedFiles. Je mettrai à jour ma réponse dès que je trouverai le bon paramètre de sortie. – Filburt

+0

Je n'ai toujours pas trouvé de solution à cela. Une idée? – Martin

0

Si vous serez satisfait de @Filburt réponse, je peux suggérer d'améliorer cette solution.

Si vous jetez un coup d'œil comment défaut Construire fonctionne cible:

<Target 
    Name="Build" 
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' " 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)" /> 

Vous verrez que la seule sortie de construire ou reconstruire cible est $ (TargetPath). $ (TargetPath) est un chemin d'accès complet à l'assemblage construit. Pour changer ce comportement, vous pouvez bidouiller le processus de construction. Mais il sera plus simple correspond de définir votre propre cible dans le projet B:

<Target 
    Name="BuildWithConfig" 
    DependsOnTargets="Clean;Build" 
    Returns="$(TargetPath);$(TargetPath).config" /> 

Dans Un projet suffit de définir la cible AfterBuild:

<Target Name="AfterBuild"> 
    <MSBuild Projects="Executable_B.proj" Targets="BuildWithConfig"> 
     <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" /> 
    </MSBuild> 
    <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="$(OutDir)\SubDirForB" SkipUnchangedFiles="true" /> 
</Target> 

Cette solution ne nécessite pas créer un script de construction personnalisé. Vous obtiendrez le résultat directement en VS.