読者です 読者をやめる 読者になる 読者になる

銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

TypeScript 独習会で、CIサーバー上でTypeScriptをMSBuildする方法を調べていました

TypeScript MSBuild

今日(正確には昨日)、 先生付きTypeScript独習会 に参加してきました。

先生付きTypeScript独習会 on Zusaar

ほかの参加者の方は普通にTypeScriptそのものを勉強しに来たと思うのですが、私はちょっと違ってTypeScriptをCIサーバー上でビルドする方法を調べていました。

というのも弊社ではすでにTypeScriptでの開発が行われていまして、ASP.NET MVC と組み合わせて使っています。そこで問題になっているのがCIサーバー上でのビルドです。ローカルではVisual Studioで開発して、Visual Studioでビルドしています。じゃあCIサーバーでどうやってビルドするの?というお話です。

Visual Studio のプロジェクトをビルドするので MSBuild を使うわけですが、Visual Studio 2013からMSBuildを単体でインストールすることが可能になりました。

MSDN Blogs マイクロソフト公式ダウンロード センターから Microsoft Build Tools 2013 をダウンロード

ASP.NET MVC のプロジェクト本体はこれを使うことにより Visual Studio 2013 をCIサーバーにインストールすることなくビルド可能です。一方、TypeScriptに関しては、 開発するときは TypeScript for Visual Studio 2012 and 2013 を入れると Visual Studio上でビルドできるようになります。

Download TypeScript for Visual Studio 2012 and 2013 from Official Microsoft Download Center

じゃあCIサーバーでどうしよう?ということになるのですが、この TypeScript for Visual Studio は for Visual Studio と書いているわりには単体でもインストールできて、確かに tsc.exe とかが配置されます。じゃあビルドできるかも?と思って MSBuild を走らせるとこんなエラーが出ます。

"C:\TypeScriptDemo\TypeScriptDemo.sln" (既定のターゲット) (1) -> "C:\TypeScriptDemo\TypeScriptBuildSample\TypeScriptBuildSample.csproj" (既定のターゲット) (2) -> C:\TypeScriptDemo\TypeScriptBuildSample\TypeScriptBuildSample.csproj(43,3): error MSB4019: インポートされたジェクト "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" が見つかりませんでした。 宣言のパスが正しいかどうか、およびファイルがディスクに存在しているかどうかを確認してください。

というのでなんとかこれを解決できないかといろいろ探していました。

検索すると、

Tom DuPont .NET: TypeScript on your Build Server

という記事が出てきたりするのですが、これは少し古い情報のようで、Microsoft.TypeScript.targets 自体は TypeScript Tools for Visual Studio をインストールすると参照できるようになっています。

より問題に近いのは

Manni on DotNet: ASP.NET MVC, TypeScript, Azure Website and Git Deploy

になります。TypeScriptをビルドして Azure Web Sites にデプロイしたいというお話です。一応これの通りやるとビルドできるっぽいのですが、よく読むとこれは TypeScript 0.9.1 じゃないとだめで最新の0.9.5 ではエラーが出ると書いてあります。実際、0.9.5 だとエラーがでます。完全にぐぬぬ....という感じです。

そもそも、 Microsoft.WebApplication.targets がないと言っているので、じゃあ手元の Microsoft.WebApplication.targets をコピペしたらいいんじゃないか?ということで、 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications を同じ位置にコピペしたのですが、すると

'Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。

というエラーが発生していましました。ここまでやると環境を構築するにも大変になってきます...

というわけで、今のところ結論としては、TypeScripをMSBuildしたければ Visual Studio をCIサーバーにも入れよう!ということに(個人的に)なりました。Visual Studio 2013 Express for Web を入れておけばビルドできるはずです。

ただ、これだとせっかくMSBuildが単体で動くようになったメリットが薄れるので、TypeScript 1.0リリースに合わせて改善してほしいなあ、ということでフィードバック先を探しています。