6

当社では、クルーズコントロール& MSBuildを使用して、継続的な統合の一環として製品のビルドを自動化しています。ビルドプロセスが強力な名前でアセンブリに署名するときにInternalsVisibleを動作させるには?

ビルドの一部は、強力な名前を持つようにアセンブリに署名することです。

ローカルで開発するプロジェクトファイルでは、MSBuildスクリプトによってオーバーライドされるため、署名は指定しません。

これは私がInternalsVisibleTo属性を使用するために必要な単体テストを導入したいと思うようになるまでうまく行きました。私はまた、このテクニックを使用する単体テストを持つ素敵なオープンソースライブラリを使い始めました。

これは私のマシン上で、私は次のステートメントを使用するAssemblyInfo.csを更新することができることを意味します

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 

をし、すべてが順調です。しかし

、ビルドマシンは、アセンブリに署名するので、その線ではなく、このように見えるように更新する必要があるだろう休憩ビルドでこれをチェック:

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, 
      PublicKey="magic key here..)"] 

私はアセンブリに署名しないように半分の心を持っていますそれを1日と呼びます。しかし、「アセンブリに署名するのがベストプラクティスです」(このマントラを3回繰り返します)、これを行うことで何らかの恩恵が得られれば、私は遠慮したくありません。

私たちはGACにはインストールしません。改ざんは特に心配していません。私たちのライブラリを使用しているサードパーティについて心配する必要はありません。最も顕著な利点は、サポートしている人がアセンブリのランダムバージョンをランタイムフォルダにコピーできず、少し時間がかかるように見えることです。

署名を有効にするために約100個のプロジェクトファイルを手動で変更する作業を行う必要はありません。私はまた、内部に公開する必要があるものをマークすることで物事をハックアップしたくない、私はバインディングリダイレクトにしたくない。&私は単体テストを削除したくない。

私は強力な名前を持っていないという簡単なことがありますが(もしあれば)、強い名前を持つことのメリットがあります。それはあまりにも多くの質問ですか?

このポストはよく問題と解決策を説明し、私はそれを利用するのMSBuildスクリプトの男のあまりないよ:

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/

この問題の適切な解決策は何ですか?

すべての入力と議論は歓迎します。

答えて

4

コンパイルする前に、キー情報をソースファイルにパッチすることができます。

次の例では、MSBuild Community TasksFileUpdateと非常に粗い正規表現を使用して、キー情報をC#AssemblyInfo.csファイルに修正しています。

<ItemGroup> 
    <AssemblyInfoFiles Include="$(MSBuildProjectDirectory)**/AssemblyInfo.cs"/> 
</ItemGroup> 
<FileUpdate 
    Files="@(AssemblyInfoFiles)" 
    Regex='(\[assembly:\s*InternalsVisibleTo\(\"[\w.]*\")(\)\])' 
    ReplacementText='$1, PublicKey="$(StrongNamingPublicKey)"$2' /> 

はしかし、私は常に厳密な名前のサインが開発と展開環境の間に1つの以上の差異を解消するためのクリーンな解決策になるために、そして簡単にスクリプト化することができ、プロジェクトを変更すると思います。

+0

ありがとう、トーマス、私はこれを試してみるつもりですが、私はそれがうまくいくと答えとして受け入れます。どこにでも強力な署名を付けるにはいくつかの問題があります。その主な点は、その変更をスクリプトする方法がわからず、手動でやりたくないという点です。 MSBuildをよく知っている人が署名をしてくれた人が書いた既存のビルドスクリプトは、大きな変更を導入するのではなく少し修正するだけです。 – Wes

+0

これはうまく動作しませんでしたが、答えとしてマークします。 動作しなかったのは、AssemblyInfoFilesという名前のItemGroupです。これは常に空になります。インクルードパターンは基本的にあなたが投稿したものです... ありがとう! – Wes

+1

上記のItemGroupは、AssemblyInfo.csファイルをパッチすることがビルドスクリプトの下のディレクトリにあることを前提としています。 '**'ワイルドカードは現在のディレクトリの下のディレクトリと一致します。 MSBuildの組み込み構文の詳細については、[方法:ビルドするファイルの選択](http://msdn.microsoft.com/en-us/library/ms171454.aspx)を参照してください。 –

5

開発者ビルドの署名を無効にしてコンパイラシンボルを定義するのと同じ構文を使用します。 DO_NOT_SIGN、そして、あなたのAssemblyInfo.csで、これを使用する:

#if DO_NOT_SIGN 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 
#else 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, PublicKey="magic key here..)"] 
#endif 

を私の個人的な意見では、ビルドスクリプトからソースコードを修正するよりもエレガントです。

+0

返信skolimaありがとう。私は、このソリューションの問題は、手動でX#ファイルに手を入れて、何度も必要なときにこの構造を作成しなければならないということです。私は他の人が新しいプロジェクトでそれをするのを忘れてはいけません。キーが変更される可能性はほとんどありません。 MSBuildスクリプトに埋め込まれた謎ではなく、誰にでもわかりやすく理解できるというメリットがあります。 私の怠惰なプログラマーは、私たちのスクリプトに既にフレームワークがあるので、ビルドスクリプトを使うつもりであると思います。 – Wes

関連する問題