2009-05-21 4 views
15

Ho aggiunto un'azione pre-build per un progetto Web controllo ASP.NET (controllo server), che esegue jsmin.exe su un set di file Javascript. Questi file di output fanno parte dell'albero di controllo del codice sorgente e sono incorporati nell'assieme.Controllo di un file out (TFS) per un'azione pre-build

Il problema si verifica quando viene eseguito il pre-build, jsmin non può scrivere il file in quanto è in sola lettura. È possibile controllare il file in anticipo? O sono costretto a impostare gli attributi del file nella riga di comando.

Qualsiasi soluzione migliore del problema è la benvenuta.

Aggiornamento Un piccolo problema con la risposta di Mehmet -Hai bisogno di anteporre la directory VS:

"$(DevEnvDir)tf" checkout /lock:none "$(ProjectDir)myfile" 

risposta

10

Se stai usando Team Foundation Server, è possibile utilizzare team foundation command line utility (tf.exe) per controllare estrai il/i file/i durante la pre-compilazione e poi ricontrollalo durante la post-compilazione. Se stai utilizzando qualcos'altro per il controllo del codice sorgente, puoi controllare se hanno uno strumento da riga di comando come tf.exe.

2

Se non si desidera controllare i file come parte della build (cosa che normalmente non si farebbe per questo genere di cose), impostarei semplicemente gli attributi dei file .js prima di eseguire jsmin su di essi. Il modo più semplice per impostare i file in scrittura leggibile consiste nell'utilizzare l'attività Attrib fornita dallo MSBuild community extensions. Le stesse estensioni della community forniscono anche un'attività JSCompress per chiamare facilmente JSMin da MSBuild.

Pertanto Avresti qualcosa di simile a quanto segue (non testato):

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 

<!-- rest of TFSBuild.proj file --> 

<Target Name="AfterGet">  
    <Message Text="Compressing Javascript files under &quot;$(SolutionRoot)&quot;." /> 
    <CreateItem Include="$(SolutionRoot)\**\*.js"> 
    <Output TaskParameter="Include" ItemName="JsFiles"/> 
    </CreateItem> 
    <Attrib Files="@(JsFiles)" ReadOnly="false"/> 
    <JSCompress Files="@(JsFiles)" /> 
</Target> 

Nota che, modificando i file dopo inducendole potrebbero causare problemi se si è tentato di passare a una generazione incrementale.

+0

Potrebbe non essere fuorviante avere file modificati che non vengono visualizzati come modifiche in sospeso? Questi potrebbero essere persi al momento del check-in. –