2013-01-18 86 views
3

我們有一個MSBuild腳本,我們用它來編譯我們項目中的所有.ts文件。首先我們創建一個包含所有.ts文件的propery組;立即編譯多個打字稿文件導致文件未找到錯誤

<ItemGroup> 
    <AllTypeScriptFiles Include="XXXXX\Scripts\**\*.ts;" Exclude="XXXX\Scripts\**\*.d.ts;" /> 
</ItemGroup> 

然後我們將這個文件列表轉儲到輸入文件並運行tsc.exe;

<WriteLinesToFile 
    File="typescriptcompiler.input" 
    Lines="@(AllTypeScriptFiles)" 
    Overwrite="true" 
    Encoding="Unicode"/>  

<Exec Command="&quot;$(MSBuildProgramFiles32)\Microsoft SDKs\TypeScript\$(TypeScriptVersion)\tsc&quot; --target ES5 @typescriptcompiler.input" 
     CustomErrorRegularExpression="\.ts\([0-9]+,[0-9]+\):(.*)" 
     IgnoreExitCode="true" > 
</Exec> 

現在,輸出狀態,一些文件無法找到;

Error reading file "XXXXX.ts": File not found 

出現這種情況的一些文件,但如果我跑tsc.exe給完全相同的路徑錯誤消息我沒有得到任何錯誤,該文件編譯。

如果我寧願編譯序列中的每個文件,而不是:

<Exec Command="&quot;$(MSBuildProgramFiles32)\Microsoft SDKs\TypeScript\$(TypeScriptVersion)\tsc&quot; --target ES5 &quot;%(AllTypeScriptFiles.Identity)&quot;" 
     CustomErrorRegularExpression="\.ts\([0-9]+,[0-9]+\):(.*)" 
     IgnoreExitCode="true" > 
</Exec> 

所有文件進行編譯沒有問題,但它僅需5分鐘,而不是10秒...

回答

3

Typescript version 0.8.3解決了這個問題!沒有更多的錯誤。

我現在能夠編譯一氣呵成的所有文件:

<ItemGroup> 
    <AllTypeScriptFiles Include="XXXXX\Scripts\**\*.ts;" Exclude="XXXX\Scripts\**\*.d.ts;" /> 
</ItemGroup> 

<WriteLinesToFile 
    File="typescriptcompiler.input" 
    Lines="@(AllTypeScriptFiles)" 
    Overwrite="true" 
    Encoding="Unicode"/>  

<Exec Command="&quot;$(MSBuildProgramFiles32)\Microsoft SDKs\TypeScript\$(TypeScriptVersion)\tsc&quot; --target ES5 @typescriptcompiler.input" 
     CustomErrorRegularExpression="\.ts\([0-9]+,[0-9]+\):(.*)"> 
</Exec> 
2

最簡單的方法來做到這一點是來接你的頂層文件(例如app.ts),並設置編譯器的輸出文件...

<Target Name="BeforeBuild"> 
    <Exec Command="&quot;$(PROGRAMFILES)\Microsoft SDKs\TypeScript\$(TypeScriptVersion)\tsc&quot; --out final.js --target ES5 @(TypeScriptCompile ->'&quot;%(fullpath)&quot;', ' ')" /> 
    </Target> 

類型cript將行走所有的依賴關係並將其編譯爲final.js

注 - 我推薦這種方式,因爲您沒有使用--module標誌。我會給commonjsamd程序提供不同的答案。

我剛剛更改my TypeScript workflow以基於Mark Rendle的想法使用此功能。

或者,您可以使用以下編譯所有.ts文件...

<ItemGroup> 
    <TypeScriptCompile Include="$(ProjectDir)\**\*.ts" /> 
    </ItemGroup> 
    <Target Name="BeforeBuild"> 
    <Exec Command="&quot;$(PROGRAMFILES)\Microsoft SDKs\TypeScript\0.8.1.1\tsc&quot; --target ES5 @(TypeScriptCompile ->'&quot;%(fullpath)&quot;', ' ')" /> 
    </Target> 
+0

我會看看這個,但它不是我所期待的答案。在我們的文件列表中,基本上有很多「根」文件,我們的應用程序的每個部分都有一個,每個單元測試文件基本上都是它自己的根。 – Julius

+0

我已經添加了一個可能有所幫助的替代方案。 – Fenton

+0

是的,這是我得到「File not found」錯誤的代碼,或者是你的代碼與我的代碼不同? – Julius