Problème:
Si vous ajoutez les fichiers générés * .js à TFS, puis TFS les protège en écriture, si vous les archivez ou ne pas les vérifier. Donc , si vous modifiez le fichier * .ts, il ne peut pas générer le fichier * .js, car le fichier est protégé en écriture.
==> Erreur
Mais si vous ne les présente pas, le fichier * .js sera absent si vous exécutez déployer.
==> Compile, mais Erreur d' exécution En
outre, si vous avez besoin comme une ressource incorporée, vous ne pouvez pas exclure le fichier ...
Problème supplémentaire 1:
Si vous exécutez « Régénérer la solution », Visual Studio veut supprimer le * .js générés par tapuscrit, avant d'exécuter la construction.
Mais la suppression est impossible, car sont protégés en écriture des fichiers du * ...
==> Erreur
Problème supplémentaire 2:
les événements de pré-construction sont propres Depuis est pas « Build », et non exécutés sur le nettoyage ...
Donc , si vous supprimez la protection en écriture sur la pré-construction, il ne fonctionnera que si vous ne « construire », mais échouera si vous choisissez « Rebuild », indépendamment du fait que vous le faites dans la solution ou dans le projet.
Problème supplémentaire 3:
Vous ne pouvez pas définir une commande pré-événement propre dans l'éditeur de projet-paramètres.
Alors, voici ce que vous pouvez faire:
Run attrib -r /s(supprime la protection en écriture) sur votre typescripted * .js que l' action de pré-construction.
par exemple
attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"
Cela fonctionne, parce que * est élargi:
- Si le fichier n'existe pas, il n'y a pas d'erreur, car aucune commande est exécutée.
- Si le fichier existe, il n'y a pas d'erreur, la commande est exécutée.
Si vous souhaitez l'exécuter sur un nom de fichier, il échouera si le fichier n'existe pas.
Maintenant, vous devez modifier le fichier de projet (* .csproj) à la main, d'ajouter une action pré-nettoyage.
L'action pré-propre est le même que l'action de pré-construction.
<Target Name="BeforeClean">
<!-- DO YOUR STUFF HERE -->
<Exec Command="attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"" />
</Target>
Et vous allez là-bas. Maintenant, vous pouvez vérifier les fichiers * .js dans, peut modifier le fichier * .ts (vous devrez déprotéger le fichier * .js ou exécutez la construction par la suite)
Si vous voulez exécuter sur une commande est la base par fichier,:
if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)
ou sous forme XML:
<Exec Command="if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)" />
Et au lieu de supprimer le attribut lecture seule gros dans l'action de pré-construction, vous pouvez également vérifier les fichiers individuels avec l'outil de ligne de commande TFS:
"$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
Soit dit en passant, vous pouvez trouver une liste des macros VisualStudio / msbuild ici:
https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view= vs-2017
Et pour connaître la valeur réelle de la macro:
- faites un clic droit sur votre projet dans la solution Explorer, sélectionnez Propriétés
- sélectionnez l' événement Construire onglet
- cliquez sur le Modifier pré-construction ou Modifier post-construction bouton, que ce soit est très bien
- dans la fenêtre qui apparaît, cliquez sur le macros bouton
- faites défiler la liste jusqu'à ce que vous trouverez
ProjectDir, dans le volet suivant est sa valeur réelle
En outre, au lieu d'utiliser l'événement pré-construction dans le projet, vous pouvez ajouter la caisse comme commande BeforeBuild-cible. Que personne façon peut accidentially l'enlever s'ils ont mis quelque chose en pré-construction dans le projet-paramètres.
<Target Name="BeforeBuild">
<Exec Command=""$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"" />
</Target>