2013-03-27 8 views
15

Używam TypeScript 0.8.3 i próbuję uzyskać compile on save do pracy.Skrypt opis kompilacji do pojedynczego pliku przy zapisie

Mam ustawiony trochę inaczej, ale powinien naprawdę działać. Należy pamiętać, że działa dobrze, gdy buduję projekt, po prostu nie zapisuję:

Oczywiście pierwsza rzecz: Narzędzia> Opcje> Edytor tekstu> TypeScript> Projekt> Kompilacja na Zapisz ustawiony na "Automatycznie kompiluj pliki TypeScript, które są częścią projektu”

Wtedy w moim pliku .csproj

<PropertyGroup Condition="'$(Configuration)' == 'Debug'"> 
    <TypeScriptTarget>ES5</TypeScriptTarget> 
    <TypeScriptSourceMap>true</TypeScriptSourceMap> 
    <TypeScriptIncludeComments>true</TypeScriptIncludeComments> 
    <TypeScriptGeneratesDeclarations>false</TypeScriptGeneratesDeclarations> 
    <TypeScriptModuleKind>AMD</TypeScriptModuleKind> 
    <TypeScriptOutFile>application.js</TypeScriptOutFile> 
    </PropertyGroup> 

    <PropertyGroup Condition="'$(Configuration)' == 'Release'"> 
    <TypeScriptTarget>ES5</TypeScriptTarget> 
    <TypeScriptSourceMap>false</TypeScriptSourceMap> 
    <TypeScriptIncludeComments>false</TypeScriptIncludeComments> 
    <TypeScriptGeneratesDeclarations>false</TypeScriptGeneratesDeclarations> 
    <TypeScriptModuleKind>AMD</TypeScriptModuleKind> 
    <TypeScriptOutFile>application.js</TypeScriptOutFile> 
    </PropertyGroup> 

    <!-- this imports the code below from Microsoft.Typescript.targets --> 
    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" /> 

I zmienił Microsoft.TypeScript.targets następująco:

<Target Name="CompileTypeScript"> 
    <Message Text="Compiling TypeScript files" /> 
    <Message Text="Creating response file typescriptcompiler.input" /> 
    <WriteLinesToFile 
     File="typescriptcompiler.input" 
     Lines="&quot;C:\MyProject\MyProject.Web\Scripts\_references.ts&quot;" <!-- recursively gets individual file paths referenced therein --> 
     Overwrite="true" 
     Encoding="Unicode"/> 

    <Message Text="Executing tsc $(TypeScriptBuildConfigurations) @typescriptcompiler.input" /> 
    <Exec Command="tsc $(TypeScriptBuildConfigurations) @typescriptcompiler.input" /> 
    <Delete Files="typescriptcompiler.input"/> 
</Target> 

A jednak nadal muszę ODBUDOWAĆ projekt, aby wygenerować mój pojedynczy application.js. Zapisanie pojedynczego pliku nie działa.

Uwaga: Musiałem zmienić plik Microsoft.Typescript.targets, aby obejść błąd bufora w bibliotece WScript używanej przez tsc podczas próby skompilowania zbyt wielu plików naraz. Zasadniczo rozwiązaniem jest zapisanie pliku, a następnie przekazanie go do kompilatora.

Jakieś pomysły, dlaczego nie rekompiluje się przy oszczędzaniu?

Istnieje ten wiersz w Microsoft.Typescript.targets, ale wydaje się, że nic nie robi, próbowałem usunąć oba warunek, więc zawsze jest prawdziwy i nie ma jeszcze kompilacji przy zapisie. Co to ma zrobić? :

<TypeScriptCompileOnSaveEnabled Condition="'$(TypeScriptEnableCompileOnSave)' != 'false' and '$(TypeScriptOutFile)' == ''">true</TypeScriptCompileOnSaveEnabled> 

Odpowiedz

7

Możesz obejść obecne ograniczenie integracji IDS TypeScript, wymuszając IDE, aby wywoływać twój cel kompilacji podczas zapisywania niektórych plików lub określonego pliku.

Krok po kroku:

  1. W Visual Studio/Solution Explorer wybrać .TS plik, który ma wyzwalać działanie podczas zapisywania;

  2. Kliknij panel właściwości (F4);

  3. Ustaw "Custom Tool" własności do „** MSBuild: *** NameOfYourMSBuildTarget *;

  4. W tym przykładzie możemy wykorzystać istniejącą CompileTypeScript cel, określony w pliku Microsoft .Maszynopis.cele, o ile ten plik jest importowany do pliku projektu;

  5. więc wartość nieruchomości będzie MSBuild: CompileTypeScript, jak widać na obrazku poniżej:

enter image description here

W tym przykładzie mam zdefiniowanej tę właściwość wyłącznie w plik _references.ts, który jest wymieniony w pytaniu. Ale możesz określić niestandardowe narzędzie w dowolnym pliku, który chcesz, zależy od Ciebie.

Sugerowałbym, aby unikać określania tego samego niestandardowego narzędzia w więcej niż jednym pliku, ponieważ będzie to zbyteczne i spowalnia proces kompilacji języka TypeScript.

Po tym, za każdym razem, gdy zapiszesz ten plik, zostanie uruchomiona akcja określona we właściwości narzędzia niestandardowego.

Ta konfiguracja będzie działała niezależnie od ustawień kompilatora TypeScript w menu Narzędzia/Opcje/Edytor tekstu/TypeScript, a także niezależnie od WebEssentials.

Mam nadzieję, że to pomoże!

+9

WOW. To tylko zdmuchnęło mój umysł bardziej niż wtedy, gdy zdałem sobie sprawę, że odbicie lustrzane 3.14 jest PIE. – parliament

+0

Za to, co jest warte, nie mogłem uzyskać tego działającego, gdy próbowałem czegoś podobnego. Zobacz moje pytanie tutaj: http://stackoverflow.com/questions/18645185/customizing-e-specific-output-files-for-various-typescript-input-files. Otwórz na wszelkie sugestie. –

6

Obecna implementacja kompilacji On-Save nie obsługuje posiadający określoną nazwę pliku wyjściowego. gdy masz już nazwę pliku wyjściowego, ta funkcja jest wyłączona. jeśli spojrzysz na plik .targets, znajduje się instrukcja, która przekazuje to samo znaczenie.

<TypeScriptCompileOnSaveEnabled Condition="'$(TypeScriptEnableCompileOnSave)' != 'false' and '$(TypeScriptOutFile)' == ''">true</TypeScriptCompileOnSaveEnabled> 

Jest to ograniczenie w obecnej wersji i powinno zostać zniesione w przyszłych wersjach. Zanotowałem błąd umożliwiający śledzenie tego: http://typescript.codeplex.com/workitem/854

+0

Czy możesz wymyślić jakieś potencjalne obejście tego problemu? Już za każdym razem denerwuje się odbudowanie tak dużego projektu, a to tylko 3 dzień. Dzięki – parliament

+0

Ta funkcja została zaprojektowana do pracy z modelem generowania plików jeden do jednego. najlepiej w tym momencie podzielić kompilację na pliki 1-1. –

Powiązane problemy