2008-09-15 13 views
148

私は複数のプロジェクトを持つソリューションを持っています。 1つのソリューションワイドアセンブリ情報ファイルをリンクしてAssemblyInfo.csファイルを最適化しようとしています。これを行うためのベストプラクティスは何ですか?ソリューションのワイドファイルに含める属性とプロジェクト/アセンブリ固有の属性アセンブリアトリビュートを使用する場合のベストプラクティスは何ですか?


編集:興味のある方はフォローアップの質問What are differences between AssemblyVersion, AssemblyFileVersion and AssemblyInformationalVersion?

答えて

194

GlobalAssemblyInfo.csという名前のグローバルファイルと、AssemblyInfo.csというローカルファイルを使用しています。グローバルファイルには、次の属性が含まれます。

[assembly: AssemblyProduct("Your Product Name")] 

[assembly: AssemblyCompany("Your Company")] 
[assembly: AssemblyCopyright("Copyright © 2008 ...")] 
[assembly: AssemblyTrademark("Your Trademark - if applicable")] 

#if DEBUG 
[assembly: AssemblyConfiguration("Debug")] 
#else 
[assembly: AssemblyConfiguration("Release")] 
#endif 

[assembly: AssemblyVersion("This is set by build process")] 
[assembly: AssemblyFileVersion("This is set by build process")] 

ローカルAssemblyInfo.csには、次の属性が含まれます

[assembly: AssemblyTitle("Your assembly title")] 
[assembly: AssemblyDescription("Your assembly description")] 
[assembly: AssemblyCulture("The culture - if not neutral")] 

[assembly: ComVisible(true/false)] 

// unique id per assembly 
[assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")] 

あなたは、次の手順を使用してGlobalAssemblyInfo.csを追加することができます。

  • プロジェクトのコンテキストメニューでAdd/Existing Item ...を選択してください。
  • 選択GlobalAssemblyInfo.cs
  • 「リンクに追加」ボタンでファイルを共有するには、リスト
+0

古いAssemblyInfo.csファイルを保存する目的は何ですか? GlobalAssemblyInfo.csでビルドバージョンスタンプを自動化すると、私のソリューションにあるAssemblyInfo.csファイルがどのように更新されますか? – D3vtr0n

+3

@Devtron個々のAssemblyInfoファイルは、それらが常駐するアセンブリに固有の情報を提供する必要があります(上記の例のように、タイトル、説明、および文化など)。製品名やバージョニング情報などの一般的なエントリは削除する必要があります(重複するとコンパイラエラーが発生します)。理想的には、AssemblyInfoファイルはビルドプロセスによって更新されません。 –

+2

^修正してください。私はそれ以来、試行錯誤でそれを理解しています。素敵で涼しいです:) – D3vtr0n

1

は、複数のプロジェクトのための単一のAseemblyInfo.csファイルを使用しているが推奨されていません。 AssemblyInfoファイルには、特定のアセンブリのみに関連する情報が含まれています。最も明白な2つの情報は、AssemblyTitleAssemblyVersionです。

2つ以上のプロジェクトにアセンブリ属性を「注入」するために、MSBuildによって処理されるtargetsファイルを使用する方がよい場合があります。

+0

20以上のプロジェクトがある場合はどうなりますか?これは私のビルド構成で、バージョン管理のためだけに20以上のエントリを維持する必要があります。それは本当に不自然なようです。 2つまたは3つの新しいプロジェクトを追加するとどうなりますか?それは間違いなくビルドプロセスを破る...任意のアイデアを解決する方法? – D3vtr0n

+0

@ D3vtr0n私は、関連するアセンブリを動的に生成し、各プロジェクトの個々の構成を維持しないことを考えています。コミュニティタスクは、私が思うに、そのケースを処理します。 – Roman

3

をドロップダウン右手

  • 選択にその小さな下向きの矢印をクリックしてアドインボタンを拡大複数のプロジェクト間で既存のファイルをリンクとして追加することができます。

    これを行うには、既存のファイルを追加し、ファイルセレクタで[リンクとして追加]をクリックします。 Add As Link http://laurent.etiemble.free.fr/dotclear/images/AddLinkedFile03_tn.png

    共有ファイルに何を入れるかについては、アセンブリ間で共有されるものを置くことをお勧めします。物事は著作権、会社、おそらくバージョンが好きです。

  • 15

    私の場合は、Visual Studioソリューションがあり、さまざまなコンポーネントを自分のプロジェクトに組み込んだ製品をビルドしています。共通の属性が使用されます。ソリューションでは、次の属性があり、約35のプロジェクト、および共通アセンブリ情報(CommonAssemblyInfo.cs)、があります。

    [assembly: AssemblyCompany("Company")] 
    [assembly: AssemblyProduct("Product Name")] 
    [assembly: AssemblyCopyright("Copyright © 2007 Company")] 
    [assembly: AssemblyTrademark("Company")] 
    
    //This shows up as Product Version in Windows Explorer 
    //We make this the same for all files in a particular product version. And increment it globally for all projects. 
    //We then use this as the Product Version in installers as well (for example built using Wix). 
    [assembly: AssemblyInformationalVersion("0.9.2.0")] 
    

    などなどAssemblyTitle、のAssemblyVersionなどの他の属性は、我々はパーに供給しますアセンブリベース。アセンブリを作成するときには、AssemblyInfo.csとCommonAssemblyInfo.csが各アセンブリに組み込まれています。これにより、すべてのプロジェクトに共通の属性と他のいくつかの特定の値を持つことができる両方の世界で最高のものが得られます。

    希望に役立ちます。

    +0

    これを処理するには、ビルド構成に35以上のエントリがありますか?むしろ冗長だと思われる。 2つまたは3つの新しいプロジェクトを追加すると、それをバージョン管理タスクに追加するまでビルドが中断されますか? – D3vtr0n

    +1

    @ D3vtr0n、なぜ "ビルド構成"(何を意味するのでしょう)には非常に多くのエントリが必要でしょうか?私はこのファイルが、 'Common.targets'ファイル内にあってもよいMSBuildディレクティブである' 'を通して各.csprojに含まれていると仮定します。コードの再利用。 – binki

    8

    MSBuild Community TasksにはAssemblyInfoというカスタムタスクが含まれており、assemblyinfo.csを生成できます。それはあなたのcsprojファイルを少し手で編集する必要がありますが、それは価値があります。

    12

    @JRoppertが提示する解決策は、私が行っている解決策とほぼ同じです。唯一の違いは、彼らがそれぞれのアセンブリに変えることができて、私は地元のAssemblyInfo.csファイルに次の行を入れていることである:

    #if DEBUG 
    [assembly: AssemblyConfiguration("Debug")] 
    #else 
    [assembly: AssemblyConfiguration("Release")] 
    #endif 
    [assembly: AssemblyVersion("This is set by build process")] 
    [assembly: AssemblyFileVersion("This is set by build process")] 
    [assembly: CLSCompliant(true)] 
    

    私も(一般的に)仮定の1つに、ソリューションごとに一つの共通のアセンブリ情報を使用しますソリューションは、単一の製品ライン/リリース可能な製品です。共通アセンブリ情報ファイルには、次のものもあります。

    [assembly: AssemblyInformationalVersion("0.9.2.0")] 
    

    Windowsエクスプローラで表示される "ProductVersion"値を設定します。

    4

    私の意見では、GlobalAssemblyInfo.csを使用することは、すべてのプロジェクトファイルを変更する必要があり、既定でAssemblyInfo.csを取得するのに対し、すべての新しいプロジェクトを変更する必要があるためです。

    グローバル値(Company、Productなど)を変更すると、変更は通常非常に少なく、管理が簡単ではありません。DRYを考慮する必要があります。ちょうどあなたが手動で一回限りのように、すべてのプロジェクト内の値を変更したいとき(MSBuild Extension Packに依存して)次のMSBuildのスクリプトを実行します。私は有用であることが判明している

    <?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    
        <ItemGroup> 
         <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" /> 
        </ItemGroup> 
    
        <Import Project="MSBuild.ExtensionPack.tasks" /> 
    
        <Target Name="UpdateAssemblyInfo"> 
        <Message Text="%(AllAssemblyInfoFiles.FullPath)" /> 
        <MSBuild.ExtensionPack.Framework.AssemblyInfo 
         AssemblyInfoFiles="@(AllAssemblyInfoFiles)" 
         AssemblyCompany="Company" 
         AssemblyProduct="Product" 
         AssemblyCopyright="Copyright" 
         ... etc ... 
         /> 
        </Target> 
    
    </Project> 
    
    1

    ことの一つは、のAssemblyVersion要素を生成することである(など)ビルド前の段階でトークン置換を適用することによって、

    私はTortoiseSvnを使用しています。SubWCRev.exeを使用してテンプレートAssemblyInfo.wcrevAssemblyInfo.csに簡単に変換できます。テンプレート内の関連する行は次のようになります。

    [assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")] 
    

    3番目の要素はリビジョン番号です。 4番目の要素を使って、新しいファイルや変更されたファイルをコミットするのを忘れていないことを確認します(4番目の要素はすべてOKの場合00です)。

    ところで、バージョンコントロールにAssemblyInfo.wcrevを追加し、を使用すると、AssemblyInfo.csを無視してください。

    関連する問題