Typescript: VisualStudioの「コンパイルなし」オプション

作成日 2015年03月11日  ·  29コメント  ·  ソース: microsoft/TypeScript

こんにちは、

最近、grunt-tsプラグインの拡張機能を開発しました。これにより、 src:やその他のオプションを使用する代わりに、入力TSファイルパスとTS構成情報のVisualStudioプロジェクトファイルをターゲットにできます。 https://github.com/TypeStrong/grunt-ts/pull/215

Grunt-tsとTaskRunner Explorerを使用すると、開発者はVisual Studio TypeScriptプロジェクトのビルド構成UIでまだサポートされていない機能(preserveConstEnumsなど)を使用できます。

Task Runner Explorerの使用に関する1つの点は、特定のVisualStudioイベントにのみフックできることです。 その中には「ビルド後」と「ビルド前」があります。 ビルド後はうまく機能しますが、VSがTypeScriptの独自のコンパイル手順を実行した後、grunt-tsがtscを呼び出すという奇妙な問題があります。 これは、パフォーマンスを除いて問題ではないようです(VSがコンパイルして発行する作業は無駄な労力であり、開発者は目的の結果を待つ必要があります)。

Visual Studio for TypeScriptでコンパイル/エミットをオフにする最善の方法は何でしょうか。ただし、他のすべては同じままにします(言語サービス/構文の強調表示、エラーリスト、C#またはVBの構築など)。 これは現在でも可能ですか? そうでない場合、それは可能でしょうか?

ありがとう!

Question

最も参考になるコメント

参考までに、VS2015 RTMには、TypeScriptCompileを無効にする簡単な方法があります。
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>.csprojに追加するだけです。たとえば、最初の<PropertyGroup>追加します。

全てのコメント29件

こんにちは、ほんの数日前に、これにいくらか関連する問題#2252を提出しました。 単一のファイル出力を持つTSプロジェクトでコンパイルオンセーブを使用するときに、ビルド前およびビルド後のイベントをトリガーする方法が必要です(通常のVSの「ビルド」および「再ビルド」コマンド、言語サービス、デバッグなどを維持しながら) 。)。 回避策として、現在、grunt-contrib-watch(「SolutionOpen」のバインディングを使用して起動)を備えたTask Runner Explorerを使用して、コンパイルされたファイルの変更を監視し、変更されるたびに追加のアクションを実行しています。

ただし、それが本当に満足できるものではなく(コンパイル前のアクションも実行する必要があり、通常、ビルド手順をすべてGruntを使用するか、すべてVSで実行することを好みます)、説明されていることを正確に実行することを検討してください。そして、カスタムのコンパイル時保存、フルビルド(単体テストの実行などを含む)、grunt-contrib-watch、grunt-ts、追加のgruntプラグイン、およびTask RunnerExplorerを組み合わせたビルド前およびビルド後のイベントを実装します。 。

(更新:すでに実装されており、正常に動作します-.tsファイルが変更されるたびにカスタムgruntビルドスクリプトを実行しますが、現在はTREの「ビルド前」および「ビルド後」バインディングをサポートしていません-上記の場合理由)。

これらの種類のビルドシナリオを効率的に許可する最も簡単な(そしてTSプラグイン開発者にとって最も関与の少ない)方法は、VisualStudioによって開始されたコンパイルの形式をオフにするオプションを提供することだと思われます。 私もそれを行う方法について何かアイデアをいただければ幸いです。

今、あなたにぴったりの選択肢があるかどうかはわかりません。 プロジェクト内のすべての.tsファイルのプロパティにBuild Action: Noneを設定すると、おそらく必要な処理が実行されますが、中規模のプロジェクトでも手動で実行するのはかなり面倒です。

ビルドは、MSBuildプロジェクトのターゲットによって派生します。 デフォルトのtypescriptビルドを無効にする場合は、ファイルからtypescriptターゲットへの参照を削除します。

これにより、言語サービスが1つのコンテキストでプロジェクト内のすべてのファイルを収集しないようになります。 それは問題ないと思います。次のリリースまでにtsconfigをサポートする必要があり、それが新しいプロジェクトになります。 それでもtsconfigを使用せずに、または次のリリースを待たずに機能させたい場合は、プロジェクトファイルでプロパティ<TypeScriptEnabled>true</TypeScriptEnabled>を定義します。

@mhegazy <TypeScriptEnabled>false</TypeScriptEnabled>ですか?

あなたが望むものによく依存します:)

言語サービスプロジェクトのコンテンツの読み込みをオフにする場合は、falseにします。
有効にしたい場合は、それをtrueにしてください。 デフォルトのターゲット(Microsoft.TypeScript.targets)を含めることですでに有効になっています

OK私はそれをいじります。 ありがとう!

@mhegazyに感謝します、設定オプションはこれまでのところ機能しているようです! (構文/準拠エラーを表示し、IEでのデバッグを許可している間)、次のように特定のソリューション構成に設定することもできます(試してみましたが、機能しているようです)。

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
...
    <TypeScriptEnabled>false</TypeScriptEnabled>
...
</PropertyGroup>

「言語サービスプロジェクトのコンテンツの読み込みを無効にする」とはどういう意味ですか? (私は、ターゲット、コンテキストなどのVSの概念にあまり精通していません)。 私がテストした限り、すべてがこのオプションで正常に機能しているようです(ビルドでコンパイルしないという予想される動作を除いて)? また、プロジェクト構成で新しく追加/作成された.tsファイルの<TypeScriptCompile Include=".."/>エントリが引き続き追加されるようです。

ちなみに、Gruntを介してすべてが行われたので、VS Buildを呼び出すときに、grunt-watchによってトリガーされるビルドと「ビルド前」/「ビルド後」のバインドされたイベント間の衝突に対処する方法を見つける必要があります。 Rebuildコマンド。VSはビルドが開始する前に自動的に保存するため、2つの異なるGruntインスタンスが不必要に並行して実行されます。

<TypeScriptEnabled>false</TypeScriptEnabled>を機能させることができません

VSでTypeScriptコンパイルを無効にするために必要な完全な手順は次のとおりです(ただし、言語サービスは機能しますが、リファクタリングを継続して行います)。

  • TypeScript「.targets」ファイルへの参照をプロジェクトファイルから削除します。
  • Visual StudioTypeScriptオプションで「プロジェクトの一部ではないTypeScriptファイルを自動的にコンパイルする」を無効にします。

2番目のステップは一種のバグです(または少なくともダイアログが厳密に正確な方法でラベル付けされていません)。 TypeScriptファイルはプロジェクトの「一部」ですが、ターゲットファイルを無効にすると、Visual Studio 2013はそれらをプロジェクトの一部ではないかのように扱い、保存時にコンパイルします(グローバルオプションが設定されていない場合)。 <TypeScriptEnabled/>に何もさせることができません

@mhegazyに感謝し

トリッキーなことの1つは、特にターゲットへのインポート後に、 <TypeScriptEnabled>false</TypeScriptEnabled>ファイルの最後に配置する必要があることです。 ターゲットがとにかくそれを定義し、あなたはそれをオーバーライドしたいので。

トリッキーなことの1つはfalse 特にターゲットへのインポート後、ファイルの最後にある必要があります。 ターゲットがとにかくそれを定義し、あなたはそれをオーバーライドしたいので。

あなたは正確に正しいです! これがトリックでした。

これで問題は解決すると思います。 ありがとう、 @ mhegazy

こんにちは@ mhegazy-ご迷惑をおかけして申し訳ありません。 TypeScript1.4がインストールされたVS2013で<TypeScriptEnabled>false</TypeScriptEnabled>機能することを確認しますか? 現在のPCをTS1.3を搭載したVS2013(ストレートVS 2013 Update 4)からTS1.4を搭載したVS2013にアップグレードしたところ、Visual Studioは「ビルド時に」TypeScriptを再度ビルドしようとしています(「ビルド」で表示されるエラーを意味します) : "それらの前に)私のプロジェクトの最後の5行は以下のとおりですが:

  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  <PropertyGroup>
    <TypeScriptEnabled>false</TypeScriptEnabled>
  </PropertyGroup>
</Project>

今日(このチケットを閉じたとき)このマシンでは正しく機能していましたが、ここに1.4を配置したため、Build fromVSでエラーが発生します。 ターゲットファイルへの参照をコメントアウトする(およびプロジェクトにないTypeScriptの「保存時にコンパイル」をオフにする)と、それでも無効になります。

私は家に1.4を持っていて、そこで<TypeScriptEnabled>false</TypeScriptEnabled>をまったく動作させることができません

<TypeScriptEnabled>false</TypeScriptEnabled>はビルドとは何の関係もありません。 それはすべて、LanguageServiceがファイルをプロジェクトの一部として扱うかどうかについてです。

F5でビルドしたくない場合は、ターゲットへの参照を削除してください。

それは短い答えでした、ここに長いバージョンがあります:

プロジェクトファイルは、次の2つの目的で使用されます。

  1. ビルド。これは通常のMSBuildサポートであり、ターゲットがタスクを呼び出し、システムが入力を見つけて一致するターゲットを見つけ、それらを順番に実行します。 したがって、これが行うことは、プロジェクト内のすべてのTypeScriptCompileアイテムを集約し、それらをいくつかのオプションとともにtsc.exeに渡すことです。
    さらに、プロジェクトプロパティページはプロジェクトファイルから派生し、MSBuildプロパティのUIにすぎません。
  2. 言語サービス、これは完了、署名ヘルプ、VSでのエラー、保存時のコンパイルなどです。これらを通常のビルドと同じように機能させたいので、ビルド用に定義したものと同じプロパティを検索し、 LSの動作。 たとえば、プロジェクトファイル( <TypeScriptTarget>ES3</TypeScriptTarget> )でターゲットがES3に設​​定されている場合、クラスでget / setを定義すると、言語サービスで赤い波線が表示されます。
    これにより、ビルド時とデザイン時の両方の動作に1セットのオプションを使用できます。
    これが機能するために、ターゲットは、プロパティ<TypeScriptEnabled>true</TypeScriptEnabled>定義することにより、typescriptについて知っていることを言語サービスに伝えます。

組み込みVSを機能させたくない場合は、ターゲットを削除するだけです。 これによりビルドが無効になりますが、このプロジェクトがTypeScriptプロジェクトではないこともLSに通知されます。 そして、すべてのファイルを「緩いファイル」として扱います。 これで問題がなければ、これ以上の作業は必要ありません。 これを変更して、プロジェクトファイルのプロパティを引き続き使用し、プロジェクトで開いている他のファイルなどを含めないようにする場合は、ファイルに<TypeScriptEnabled>true</TypeScriptEnabled>を追加すると、LSがそれに応じて処理します。 。

ビルドをVSで機能させたいが、LSがそれをプロジェクトとして扱わないようにする場合は、フラグをfalseに設定します。

ありがとう。 これは素晴らしい情報であり、すべてがあなたが説明したことと一貫して機能しているようです。 .targetsファイルを削除したが、 TypeScriptEnabledをtrueに設定した場合、TypeScriptビルドタブがプロジェクトのプロパティから消えるはずですか?

  <!--
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  -->
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>
</Project>

もしそうなら、これは奇妙に思えます。ターゲットを再度有効にしてからUIを使用しないと、UIでアクセス可能な設定を制御する方法がないためです(または、より現実的には、その時点でTSプロジェクト設定を直接編集するだけです。とにかくそこにいます)。

私がこれをすべて求めている理由は、数週間前にnpmライブラリを作成して.csprojと.vbproj(https://www.npmjs.com/package/csproj2ts)からTypeScriptビルドプロパティを読み取るためです。現在、grunt-tsに統合しています。 準備ができたら、効果的に「.csprojファイルに対してtscを実行する」簡単な方法があります(ここで要求されているように:https://github.com/Microsoft/TypeScript/issues/1702)。 コーディング体験にVSTypeScript言語サービスを使用するようにプロジェクトを設定するための最良の方法を人々に伝えたいのですが、構築には完全にgrunt-tsを使用します。 このシナリオでは、UIを使用してTypeScriptプロパティを構成できるようになることを期待していましたが、おそらくそうではありません。

TypeScript .targetsファイルを無効にしてTypeScriptビルドタブを表示する方法を知っていますか?

また、 <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition=" '$(Configuration)' == 'Debug' " />ようなことをしたとしても、TypeScriptビルドタブを表示するには、プロジェクト構成をデバッグに設定してからリロードする必要があるようです。

申し訳ありませんが、 @ mhegazy-私はあなたを

TypeScriptビルドタブがプロジェクトのプロパティから消えることが期待されていますか?

はい、プロパティページはターゲットに配線されているため、それらを削除するとUIが削除され、ファイルを手動で編集する必要があります

私がこれをすべて求めている理由は、数週間前にnpmライブラリを作成して.csprojと.vbproj(https://www.npmjs.com/package/csproj2ts)からTypeScriptビルドプロパティを読み取るためです。現在、grunt-tsに統合しています。

あなたが達成しようとしているシナリオは実行可能ですが、いくつかの荒削りな部分があり、それを機能させるにはいくつかの場所をハックする必要があります。 @paulvanbrenkは現在、VSでtsconfigのサポートを追加しています。これにより、プロジェクトのプロパティページでtsconfigファイルが存在する場合にそれを使用できるようになります。 また、 ASP.net 5プロジェクトへの統合の改善にも取り組んでいます。これにより、1。grubt/ bowerのサポート、2。ファイルシステムベースのビュー、3。tsconfigを使用したプロジェクトプロパティの管理

また、私がこのようなことをしたとしてもそうです: 、TypeScriptビルドタブを表示するには、プロジェクト構成をデバッグに設定してからリロードする必要があります。

プロジェクトがロードされると、インポートがロードされます。 したがって、このインポートでは、「構成」「デバッグ」でのみロードされると言っているので、構成を変更してもリロードは強制されません。

申し訳ありませんが、 @ mhegazy-私はあなたを
:D心配ありません。 常にフィードバックを得るのが大好きで、それが役に立てば幸いです。

OK。 本当に、このような素晴らしい情報と徹底的な議論に感謝します。

@paulvanbrenkにそれを投げるだけtsconfigを使用して、VisualStudio TypeScriptビルド(CTRL + SHIFT + Bを意味する)を無効にする機能を備えた何らかの方法があると素晴らしいでしょうC#などをビルドしますが、TypeScriptはビルドしません)、GUIを介してTypeScriptオプションを設定する機能を残したまま、外部のTypeScriptコンパイラを使用します。 外部コンパイルツールを使用することが非常に役立つ理由はたくさんありますが、現時点では、これは実際には偶然にのみサポートされており、いくつかの荒削りな部分があるように感じます。

tsconfigアイデアは素晴らしいですが、実際には役に立ちません。

  • TypeScriptの古いバージョンを使用する
  • 同じコンピューター上の異なるプロジェクトで異なるバージョンのTypeScriptを使用する
  • TypeScriptの実験バージョン(JSXをサポートする@fdecampredonのバージョンなど)を使用する
  • 参照管理を自動化し、TypeScriptがサポートしていない他の雑用を行うgrunt-tsのようなビルドツールを使用する
  • 等。

Visual Studioユーザーがコミュニティで開発されたTypeScriptコンパイラシステムを選択できるようにすると同時に、Visual Studio内の優れたUIを維持することは素晴らしいことです(特に、優れたTask Runner Explorerアドオンを使用する場合)。 「TypeScriptビルドを無効にする」というチェックボックスをコーディングするのにかかる時間と、これによって可能になるコミュニティへの大きなメリットを比較検討していただければ幸いです。

「TypeScriptビルドを無効にする」というチェックボックスをコーディングするのにかかる時間と、これによって可能になるコミュニティへの大きなメリットを比較検討していただければ幸いです。

これは私が混乱する部分です。 私にとって、これはtypescriptターゲット参照を削除し、それを別の方法で構築するgruntターゲットに置き換えることです。 何もしないように指示する条件で.targetsファイルを含めるのは私には奇妙に感じます。 そもそもなぜそれを含めるのですか? 標準のtypescriptターゲットを置き換える.targetsファイルの作成をお手伝いさせていただきます。このファイルには<TypeScriptEnabled>true</TypeScriptEnabled>タグが含まれ、VSはデフォルトのファイルであるかのように見えますが、ビルドの処理は異なります。

ええと。 私はそれを考えるべきでした-私は.targetsファイルをこの変更できないものとして扱ってきたと思いますが、もちろんこれは完全に理にかなっています。 ターゲットファイル形式を調べて、返信します。

開始する簡単な方法は、ターゲットファイルMicrosoft.TypeScript.Targetをコピーし、tscの呼び出しなど、気にしないものを削除し、gruntを呼び出すタスクを追加し、構成にワイヤリングするなどです。あなたのプロジェクト。

驚くばかり! .csprojファイルに次の4行を設定することで、ミニマリストの観点からすべてが機能するようになりました。

  <Import Project="$(ProjectDir)\custom.TypeScript.targets" />
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>

そして、ミニマリストのcustom.TypeScript.targetsファイルは次のとおりです。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VsToolsPath Condition="'$(VsToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VsToolsPath>
  </PropertyGroup>
  <UsingTask TaskName="TypeScript.Tasks.VsTsc" AssemblyFile="$(VSToolsPath)\TypeScript\TypeScript.tasks.dll" />
  <PropertyGroup>
    <CfgPropertyPagesGuidsAddCSharp>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddCSharp>
    <CfgPropertyPagesGuidsAddVB>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddVB>
    <CfgPropertyPagesGuidsAddTypeScript>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddTypeScript>
  </PropertyGroup>
  <ItemGroup>
    <ProjectCapability Include="TypeScript" />
  </ItemGroup>
</Project>

<TypeScriptEnabled />タグをターゲットファイルに入れようとしましたが、機能しませんでした(VSは.tsファイルを緩いものとして扱っていました)。 それがなぜであるかについて何か考えはありますか? (MSBuildを知っている人にとっては、これは明らかです-おそらく何らかのスコープの問題ですか?)

これで私の問題は解決したと思います。 VSビルドがトリガーされたときにGruntまたはGulpタスクを開始できるTaskRunner Explorer拡張機能を使用して、Gruntタスクを実行できます。 TypeScriptのコンパイル結果に関係なく、ビルドは常に成功したと表示されるようになりましたが、ユーザーはTRXウィンドウでgrunt-tsからの出力を確認できるため、これは問題ありません。 「TypeScriptビルド」パネルがプロジェクトのプロパティウィンドウに表示されます。 そのオプションが選択されている場合、保存時にコンパイルが機能します。 C#またはVBコードが正常にコンパイルされない場合でも、ビルドは失敗として表示されます(良いことです)。 デフォルトのVisualStudio「TypeScriptを使用したHTMLアプリケーション」またはASP.NETWebプロジェクトからここに到達するためのセットアップはかなり簡単です。

上記のミニマリストの.targetsファイルをgrunt-tsで配布することに問題がありますか? それは我々が唯一の彼らのプロジェクトの.targets行を更新するために人々に伝える必要があるだろうことを意味する<Import Project="$(ProjectDir)\node_modules\grunt-ts\custom.TypeScript.targets" />と設定<TypeScriptEnabled>

再度、感謝します!!

入れてみましたターゲットファイルのタグが機能していませんでした(VSは.tsファイルを緩いものとして扱っていました)。 それがなぜであるかについて何か考えはありますか? (MSBuildを知っている人にとっては、これは明らかです-おそらく何らかのスコープの問題ですか?)

変ですね。 これが私たちのターゲットにある方法であり、正常に機能します。 プロパティを持つ他のターゲットを含めていますか? 何か条件はありますか? 私は新しいtsプロジェクトでそれを試し、Microsoft.TypeScript.targetsを削除し、あなたのものを入れて、追加しましたtrue そしてそれはうまくいった。

上記のミニマリストの.targetsファイルをgrunt-tsで配布することに問題がありますか? つまり、プロジェクトの.targets行を次のように更新するように人々に指示するだけで済みます。 とセット

これが正しい道だと思います。 TypeScriptEnabledもそこに入れようとします。 問題の診断にどのように役立つか教えてください

いくつかの注意点として、他の目的で必要な場合を除いて、tasks.dll参照やVsToolsPath定義は必要ありません。

自宅のコンピューターであなたが予測した動作が表示されています。 また、DLLを参照せずに機能しました。 以前に何か間違えたに違いないので、明日またやってみます。 これは本当に素晴らしいと思います! ありがとう、モハメド。 これは、数日中にgrunt-tsの一部としてリリースされるはずです。

これを引き起こしている可能性のあるものの1つは、ターゲットファイルがVSに1回だけロードされるため、ターゲットを編集した場合、VSを再起動するまで変更がプロジェクトに反映されないことです。

それがそれだったかもしれません。 プロジェクトをアンロード/リロードしていました。 自宅でVSを再起動した可能性があります。 それをドキュメントに書き留めておきます。

@mhegazyご協力ありがとうございます。 「VisualStudioプロジェクトからコンパイル」機能を含むgrunt-ts4.0.0をリリースしました。

https://github.com/TypeStrong/grunt-ts#vs

VSビルドを無効にする手順:

https://github.com/TypeStrong/grunt-ts/blob/master/docs/DisableVisualStudioBuild.md

とてもかっこいい! これが可能にするシナリオが大好きです。

ありがとう、ライアン。 私はそれがどのようになったかにかなり満足しています。 tsconfigが登場すると、それはそれほど必要ではないかもしれませんが、これはそれまでのギャップを埋め、もちろん1.5より前のTypeScriptコンパイラバージョンと互換性があります。

PS:今日は2つのバグレポートがあったので、修正できると仮定して、今夜は4.0.1をプッシュする必要があります。

参考までに、VS2015 RTMには、TypeScriptCompileを無効にする簡単な方法があります。
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>.csprojに追加するだけです。たとえば、最初の<PropertyGroup>追加します。

ありがとう。

このページは役に立ちましたか?
0 / 5 - 0 評価