Problema:
Se si aggiungono i file generati * .js a TFS, poi TFS scriverle-protegge, se si controlla loro, o non Dateci un'occhiata. Quindi, se si modifica il file * .ts, non può generare il file .js, perché il file è protetto da scrittura.
==> Error
Ma se non si seleziona loro, il * .js file sarà mancare se si esegue distribuire.
==> errore compila, ma Runtime
Inoltre, se ne avete bisogno come risorsa incorporata, non è possibile escludere il file ...
Ulteriore problema 1:
Se si esegue "Rigenera soluzione", Visual Studio vuole cancellare il file * .js generati da dattiloscritto, prima di eseguire build.
Ma la cancellazione non è possibile, in quanto i file * .js sono protetti da scrittura ...
==> Error
Ulteriore problema 2:
Dal momento che non è pulito "Build", la pre-compilazione eventi non vengono eseguiti sul pulito ...
Quindi, se si rimuove la protezione da scrittura sulla pre-build, funzionerà se non "costruire", ma avrà esito negativo se si sceglie "Rebuild", indipendentemente dal fatto che lo si fa nella soluzione o nel progetto.
Ulteriore problema 3:
Non è possibile definire un comando evento di pre-pulita in l'editor di progetto-settings.
Quindi, ecco cosa si può fare:
Run attrib -r /s(rimuove la protezione da scrittura) sul tuo typescripted * .js file come azione di pre-compilazione.
per esempio
attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"
Questo funziona, perché * si espande:
- Se il file non esiste, non c'è nessun errore, perché viene eseguito nessun comando.
- Se il file non esiste, non c'è nessun errore, viene eseguito il comando.
Se desideri esegue su un nome di file, sarebbe errore se il file non esiste.
Ora, è necessario modificare il file di progetto (* .csproj) a mano, aggiungere un'azione di pre-pulito.
L'azione di pre-pulita è la stessa come l'azione pre-compilazione.
<Target Name="BeforeClean">
<!-- DO YOUR STUFF HERE -->
<Exec Command="attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"" />
</Target>
E ci si va. Ora è possibile controllare i file .js in, in grado di modificare il file * .ts (è necessario rimuovere la protezione del file .js, o eseguire accumulo in seguito)
Se si desidera eseguire su una base per file, il comando è:
if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)
o in XML-forma:
<Exec Command="if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)" />
E invece di rimuovere l'attributo di sola lettura ingrosso nell'azione pre-build, è anche possibile controllare i singoli file con lo strumento TFS riga di comando:
"$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
Tra l'altro, è possibile trovare un elenco di macro VisualStudio / MSBuild qui:
https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view= vs-2017
E per scoprire il valore reale della macro:
- fate clic destro sul progetto in Solution Explorer, selezionare Proprietà
- selezionare l'Eventi di compilazione scheda
- fare clic sul Modifica pre-compilazione o Modifica post-generazione tasto, o va bene
- nella finestra che si apre, fare clic sul Macro tasto
- scorrere l'elenco fino a trovare
ProjectDir, nel riquadro successivo è il suo valore reale
Inoltre, invece di usare l'evento pre-compilazione nel progetto, è possibile aggiungere alla cassa come comando di BeforeBuild-bersaglio. In questo modo nessuno può accidentalmente rimuoverlo se hanno messo qualcosa nel pre-compilazione nel progetto-settings.
<Target Name="BeforeBuild">
<Exec Command=""$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"" />
</Target>