7
votes

MSBUILD: Déploiement de fichiers non inclus dans le projet

J'ai un événement de pré-construction sur un projet Web qui minifie et concaténate les fichiers JavaScript à l'aide de nœuds. Cela crée un dossier appelé Builtscripts dans le dossier Scripts qui est un duplicata du dossier scripts, à l'exception des fichiers minifiés. Lorsque je fais un déploiement, je souhaite publier le dossier scripts, y compris le dossier Builtscripts de celui-ci. Pour y parvenir, j'ai ajouté le dossier Builtscripts au projet. Ce n'est pas une solution idéale comme:

  1. Je dois faire vérifier le dossier Builtscripts afin de construire en tant que fichiers qu'il est lu que la solution est sous contrôle source. Cela crée des tracas lors de l'enregistrement au fur et à mesure que j'ai tellement de fichiers vérifiés.
  2. Lorsque j'ajoute un nouveau fichier au projet, je dois m'assurer que je me souvenais de l'ajouter au dossier Builtscripts ou que la version construite du fichier ne sera pas déployée.
  3. Ma construction échouera sur le serveur de construction car les fichiers du dossier Builtscripts sont en lecture seule là aussi.
  4. Avoir deux copies d'un fichier avec le même nom est un problème lors de la recherche de fichiers et de faire des recherches basées sur des textes.

    Je voudrais avoir la construction du serveur de construction et les fichiers JavaScript comme une étape de pré-construction, mais je ne veux pas que le dossier Builtscripts ajouté au projet. Toutefois, lorsque le serveur de construction conditionnelle le projet à la fin, je souhaite copier le dossier Builtscripts avec la sortie du processus de construction. Comment puis-je atteindre cela?


7 commentaires

Qu'est-ce que vous utilisez pour déployer \ Publish - est cette cible MSBuild standard ou avez-vous fait quelque chose de personnalisé?


@ALEXEYSHCHERBAK MSBUILD, TFS, rien de coutume


Je soupçonne dit que Ibrahim Hashimi a écrit ce post avec réponse après votre question :). SeDoDream.com/2012/10/09/...


=) OK, cela pourrait être pur coïncident. Quoi qu'il en soit, on dirait que sa réponse convient mieux à votre question. Pour cette question, j'ai fait des msbuild qui creuser la même direction que l'on a dit. La réponse sural a dû être très très similaire à celle de son. Maintenant c'est un peu obsolète;)


@ALEXEYSHCHERBAK Pourquoi dites-vous que c'est obsolète?


=) Je ne vois tout simplement pas de raison pour poster ici répondre très très très très similaire à la poteau de blog de Sayed. J'ai fourni un lien à son poste très détaillé et je pense que votre question répondit là-bas. C'est pourquoi je considère que je considère que la réponse "pas encore postée", inutile.


@ALEXEYSHCHERBAK OK, mal interprété, pensais que vous disiez que son poste était obsolète.


3 Réponses :


0
votes

Vous ne pouvez pas utiliser un événement post-construction pour exécuter un script pour faire ce que vous voulez? J'utilise un pour déplacer mes fichiers de sortie vers un emplacement complètement indépendant du projet. Que ce soit son lot simple, VBScript / JScript ou PowerShell, vous pouvez faire à peu près tout ce que vous voulez.


0 commentaires

7
votes

Au lieu d'utiliser l'événement de pré-construction des propriétés du projet (que je pense est ce que vous voulez dire), remplacez la cible avant-couril dans le fichier .csproj / .vbproj.

<Project ...>
  ...
  <Target Name="BeforeBuild">
    <!-- Create the 'BuildScripts' directory. -->
    <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to -->
    <!-- use for these kinds of things. -->
    <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts">
      <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" />
    </MakeDir>
    <!-- Execute the javascript minifier. -->
    <Exec Command="..." />
    <!-- Create an item group for the minified scripts so we manipulate the target path. -->
    <CreateItem Include="$(BuildScriptsPath)\*.js">
      <Output ItemName="BuiltScripts" TaskParameter="Include" />
      <Output ItemName="FileWrites" TaskParameter="Include" />
    </CreateItem>
    <!-- Add the minified scripts to the Content item group, -->
    <!-- which the deployment MSBuild inspects for files to deploy. -->
    <CreateItem Include="@(BuiltScripts)"
      AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>
  ...
</Project>


2 commentaires

Ajoutez-vous une étape pour supprimer le contenu des dossiers Builtscripts précédents?


J'ai dirigé mon code d'échantillon et il semble que la cible incrémentialclean supprimera automatiquement les fichiers car ils sont inclus dans le groupe d'éléments FileWrites, ce qui est utile lorsque vous supprimez un fichier .js et vous ne voulez plus qu'il soit déployé.



0
votes

J'ai eu une exigence similaire, même si cela impliquait que l'ajout de fichiers existants à un package de déploiement plutôt que de les générer dans le cadre de la construction. J'ai trouvé la technique sur Cette page utile.


0 commentaires