Posts

Showing posts from November, 2011

FxCop Integrator 2.0.0 RC 版をリリース

Image
FxCop Integrator 2.0.0 の RC 版をリリースしました。CodePlex のプロジェクトサイトからダウンロードできます。RC 版では 11/11 にリリースしたベータ版に加えて、以下のような機能を追加しました。MSBuild タスクの提供MSBuild のコード分析カスタムタスクを提供しました。Visual Studio からオンデマンド実行する時と同じように、コード分析設定ファイル (CodeAnalysisConfiguration.xml) を読み込み、全く同じロジックでコード分析を行います。MSBuild タスクは FxCop Integrator をインストールするための VSIX ファイルとは別に、独立したインストーラで提供しています。つまり、Visual Studio がない環境にもインストールできます。CI 環境に MSBuild タスクだけインストールし、デイリービルド時に FxCop Integrator と同じ設定でコード分析を行わせることも可能です。MSBuild タスクをインストールすると、%PROGRAMFILES%\MSBuild\FxCop Integrator\FxCopIntegrator.targets が作成されます。プロジェクトファイルに<Import Project="$(PROGRAMFILES)\MSBuild\FxCop Integrator\FxCopIntegrator.targets" />を追加してターゲットファイルをインポートし、MSBuild のパラメータに/p:FxCopCmdPath=FxCopCmd.exe のパス /p:EnableCodeInspectionOnBuild=trueを指定すれば、ビルド後にコード分析が実行されます。ちなみに/p:MetricsPath=Metrics.exe のパス /p:EnableCodeMetricsCalculationOnBuild=trueを指定すると、コードメトリクス計測も実行できます。FxCop Integrator 2.0.0 Beta 2 の「ビルド時のコード分析」機能も、内部的な仕様が変わります。2.0.0 Beta 2 までは、FxCop Integrator のオンデマンドコード分析…

GAE に配置した Servlet が動かなくてしばらく困っていたけどようやく解決

Image
ちょっと GAE/J を使って作りたいものができたので、JDK 1.7.0 + Eclipse 3.7.1 が入ってる PC に GAE SDK 1.6.0 を入れてみました。ちょちょいとサンプルアプリケーションを作ってローカルでは動かすことができましたが、GAE にデプロイしてみると Servlet が動かず、こんなエラーを返して来ました。Error: Server Error
The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.GAE の管理コンソールからログを見てみると、こんな例外が。Failed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@1fc468e{/,/base/data/home/apps/s~sasaminn-gae-sample/1.354956893975889229}
org.mortbay.util.MultiException[java.lang.UnsupportedClassVersionError: sasa/gae_sample/Gae_sampleServlet : Unsupported major.minor version 51.0]…UnsupportedClassVersionError とか言っているので GAE SDK のヘルプを見てみたところ、Google App Engine では、Java 5 と Java 6 がサポートされています。App Engine 上で実行される Java アプリケーションは、Java 6 仮想マシン(JVM)と標準ライブラリを使用して動作します。とのこと…。1.6 用にコンパイルしないとダメなのね…。JDK のダウングレードとかしたくなかったので、何とかできる方法がきっとあるはずと思って探してみたら、1つ方法を発見。プロジェクトのプロパティに Java Com…

アセンブリをロードせずに完全名を取得する

ここ最近 FxCop Integrator のコード分析と同じ動作をする MSBuild タスクを作り、ビルド実行時にカスタムタスクを呼び出してコード分析を走らせられるようにしていました。そこで悩まされたのが、一度ビルドするとプロジェクト参照しているアセンブリをロックしてしまい、次回以降参照先プロジェクトがビルドできなくなるという現象。調べてみるとどうやら Assembly.LoadFrom() でアセンブリをロードしているのが問題のようでした。バージョン 1.4.0 の頃、アセンブリ参照エラーでコード分析が実行できないという障害報告をいくつかもらっていたので、FxCop Integrator 2.0.0 にはアセンブリ参照エラーが発生したら、アセンブリ参照の解決を行ってコード分析をリトライする機能をつけました。これが実際どう動いているかというと、コード分析実行のタイミングでプロジェクトの参照設定のリストから、参照している全てのアセンブリのパスを取得する参照先の各アセンブリの完全名を取得し、完全名をキー、パスを値としたハッシュテーブルに格納しておく。アセンブリ参照エラーが発生したら、エラーメッセージから参照できなかったアセンブリの完全名を取得して、上記のハッシュテーブルからアセンブリのパスを探し出し、そのアセンブリも参照するようにしてコード分析をもう一度やり直す。ということをやっています。上記の 2 のところでアセンブリの完全名が必要なので、Assembly.LoadFrom() でアセンブリをロードして完全名を取得しているのですが、どうもこれがよくない模様。Visual Studio から起動された MSBuild で動いているカスタムタスクがアセンブリをロードすると、それがずっとメモリ上に常駐してしまう (結果的にアセンブリファイルがロック状態になる) らしいのです。アセンブリ参照エラーの自動リカバリは捨てたくないので、別 AppDomain にロードして完全名だけ返してもらって AppDomain をアンロードするとか、アセンブリのバイナリデータを自力で解析して完全名を取得するとか色々考えたのですが、実は簡単に解決する方法がありました。それが AssemblyName.GetAssemblyName() という static メソッド。引数にアセンブリのパス…

FxCop Integrator 2.0.0 ベータ版をリリース

Image
FxCop Integrator 2.0.0 のベータ版をリリースしました。CodePlex のプロジェクトサイトからダウンロードできます。

FxCop Integrator は Visual Studio 2010 (Pro 以上) に FxCop を統合して、Premium や Ultimate で実装されている「コード分析」と同じように実行できるようにする、Visual Studio の拡張機能です。コマンドラインオプションの細かい設定などを意識せず、VS2010 から簡単に FxCop が実行できます。また、分析結果のフィルタリングや FxCop のルールの詳細を表示する機能も実装しています。

バージョン 2.0.0 では、コードメトリクスを測定する Visual Studio Code Metrics Power Tools 10.0 のサポートの他、ユーザから提案されたいくつかの新機能を実装しています。


Visual Studio Code Metrics Power Tools 10.0 の統合
FxCop Integrator 2.0.0 では、Permium や Ultimate で実装されている「コードメトリクス」機能のコマンドライン版、Visual Studio Code Metrics Power Tools 10.0 もサポートしました。FxCop と同じように、ソリューションエクスプローラのコンテキストメニューから簡単に実行させることができます。


実行すると、FxCop の結果と同じようにコードメトリクス測定結果の一覧が表示されます。もちろん、フィルタリングや該当のソースコードをフォーカスする機能もサポートしています。


FxCop と Metrics の両方をサポートしたので、コード分析を実行するメニューを複数に分割しました。
[Code Analysis] : FxCop と Metrics を両方同時に実行します。 [More Tasks…] > [Inspect XXX] : FxCop のみを実行します。 [More Tasks…] > [Calculate Metrics] : Metrics のみを実行します。
Metrics を使うつもりがない場合は、バージョン 1.X 系と同様に、[Code Analysi…

テスト

テスト