2011-07-07 66 views
1

我剛剛開始在MSBuild中玩耍,並且正在將一個nAnt構建腳本移植到MSBuild。編譯看起來非常簡單,但我想要做的一件事是針對目錄中的每個文件運行一個Java程序。我終於找到了工作,但看起來很詭異,我確信有一個更簡潔的方法可以做到這一點。這裏是我的代碼:MSBuild - 爲每個文件運行一個Java程序是一個目錄

<!-- Crunch Files --> 
<ItemGroup> 
    <ToCrunch Include="$(BuildDir)/WWW/Scripts/kpc*.js;$(BuildDir)/WWW/Styles/*.css" /> 
</ItemGroup> 
<ConvertToAbsolutePath Paths="@(ToCrunch)"> 
    <Output TaskParameter="AbsolutePaths" ItemName="AbsoluteFiles" /> 
</ConvertToAbsolutePath> 

<Message Text="Crunching Script Files..." /> 
<Exec WorkingDirectory="Crunch" Command="Java.exe -jar yuicompressor-2.4.2.jar %(AbsoluteFiles.Identity) -o %(AbsoluteFiles.Identity) --charset utf-8" /> 

這裏是我的上述做法的問題:

  • 我要工作目錄設置爲緊縮其中java.exe的生活,即使JAVA.EXE是系統路徑並應該正常工作。

  • 因爲我改變了工作目錄,ItemGroup中包含的文件不再相對於工作目錄,所以現在我必須將它們全部轉換爲它們的絕對路徑。

  • 該程序非常慢,每個文件需要幾秒鐘。所以我得到的是「搗毀腳本文件」,然後延遲20秒左右。我想輸出一個消息到屏幕上,而不是每個正在處理的文件。

下面是同樣的事情在南特:

 <!-- Crunch Javascript/CSS Files --> 
    <foreach item="File" property="filename"> 
    <in> 
     <items> 
      <include name="${build.dir}/WWW/Scripts/kpc*.js" /> 
      <include name="${build.dir}/WWW/Styles/*.css" /> 
     </items> 
    </in> 
    <do> 
     <echo message="Crunching File ${filename}" /> 
     <exec program="Crunch/java"> 
      <arg value="-jar" /> 
      <arg value="Crunch/yuicompressor-2.4.2.jar" /> 
      <arg file="${filename}" /> 
      <arg value="-o" /> 
      <arg file="${filename}" /> 
      <arg line="--charset utf-8" /> 
     </exec> 
    </do> 
    </foreach> 

如果任何人有任何的方式來解決所有的上述問題,我會非常感激。謝謝!

+0

好的,我找到了一種解決絕對路徑的方法。我可以使用%(ToCrunch.FullPath)而不是.Identity,然後我不必轉換所有路徑。因此,一個問題無論如何.. –

回答

1

我最終通過使用FullPath屬性而不是Identity屬性來解決此問題,該屬性給出了完整路徑。

爲什麼MSBuild即使在系統路徑中也找不到程序是個謎。

此外,有一個.NET Port of YUI Compressor有MSBuild的支持 - 我打算試試這將使問題不再相關。

相關問題