2008-09-15 7 views
148

여러 프로젝트가있는 솔루션이 있습니다. 한 솔루션 넓은 어셈블리 정보 파일을 연결하여 AssemblyInfo.cs 파일을 최적화하려고합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 솔루션 과이드 파일에 어떤 속성이 있어야하며 프로젝트/어셈블리에 어떤 속성이 있어야합니까?조립품 속성을 사용하는 가장 좋은 방법은 무엇입니까?


편집 : 당신이 관심이 있다면 사용하지 않는 것이 좋습니다 여러 프로젝트에 대한 단일 AseemblyInfo.cs 파일을 사용하여 후속 질문 What are differences between AssemblyVersion, AssemblyFileVersion and AssemblyInformationalVersion?

답변

194

GlobalAssemblyInfo.cs라는 전역 파일과 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를 추가 할 수 있습니다

    [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

    는 다음과 같은 속성이 포함되어 글로벌 파일에는 다음과 같은 속성을 포함 프로젝트의 컨텍스트 메뉴에서 Add/Existing Item ...을 선택하십시오.
  • 선택 GlobalAssemblyInfo.cs
  • "링크로 추가"버튼에서 파일을 공유하려면 목록
+0

이전 AssemblyInfo.cs 파일을 유지하려는 목적은 무엇입니까? GlobalAssemblyInfo.cs에서 빌드 빌드를 자동화 할 때, 내 솔루션에있는 AssemblyInfo.cs 파일을 어떻게 업데이트합니까? – D3vtr0n

+3

@Devtron 개별 AssemblyInfo 파일은 거주중인 어셈블리에 고유 한 정보를 제공해야합니다 (위의 예에서와 같이 제목, 설명 및 문화권). 제품 이름 및 버전 정보와 같은 공통 항목을 제거해야합니다 (복제 된 경우 컴파일러 오류가 발생합니다). 이상적으로 AssemblyInfo 파일은 빌드 프로세스에 의해 업데이트되지 않습니다. –

+2

^수정하십시오. 나는 시행 착오를 통해 그것을 알아 냈다. 멋진 친절하고 멋진 :) – D3vtr0n

1

에게 있습니다. AssemblyInfo 파일에는 해당 어셈블리에만 관련된 정보가 들어 있습니다. 두 가지 가장 분명한 정보는 AssemblyTitleAssemblyVersion입니다.

두 개 이상의 프로젝트에 어셈블리 특성을 "주입"하기 위해 MSBuild에서 처리하는 targets 파일을 사용하는 것이 더 좋은 해결책 일 수 있습니다.

+0

20 개 이상의 프로젝트가 있다면 어떻게됩니까? 따라서 버전 관리를 위해 빌드 구성에서 20 개 이상의 항목을 유지해야합니다. 그것은 정말로 절름발이 인 것처럼 보인다. 2 개 또는 3 개의 새 프로젝트를 추가하면 어떻게됩니까? 그건 분명히 빌드 과정을 깰 것입니다 ... 어떤 아이디어를 해결하는 방법? – D3vtr0n

+0

@ D3vtr0n 필자는 관련 어셈블리를 동적으로 생성하고 각 프로젝트의 개별 구성을 유지 관리하지 않는 것이 좋다고 생각합니다. 커뮤니티 작업 (Community Tasks)은 그 사건을 처리합니다. – Roman

3

드롭 다운 오른쪽

  • 선택에 그 작은 아래쪽 화살표를 클릭하여 추가 기능 버튼을 확장 여러 프로젝트간에 기존 파일을 링크로 추가 할 수 있습니다.

    기존 파일을 추가하고 파일 선택기에서 "링크로 추가"를 클릭하십시오. Add As Link http://laurent.etiemble.free.fr/dotclear/images/AddLinkedFile03_tn.png

    공유 파일에 무엇을 넣을 지에 관해서는 어셈블리 전체에서 공유 할 것들을 두는 것이 좋습니다. 저작권, 회사, 아마도 버전 같은 것들.

  • 15

    필자가 우리 자신의 프로젝트에 다양한 구성 요소가있는 Visual Studio 솔루션을 갖춘 제품을 만들고 있습니다. 공통 속성이 적용됩니다. 솔루션에서 약 35 프로젝트, 다음과 같은 속성이있는 일반적인 어셈블리 정보 (CommonAssemblyInfo.cs)이 있습니다 : 등등 AssemblyTitle, AssemblyVersion 등

    [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")] 
    

    다른 속성은, 우리는 행된에 공급 어셈블리 기반. 어셈블리를 만들 때 AssemblyInfo.cs 및 CommonAssemblyInfo.cs가 각 어셈블리에 내장됩니다. 이렇게하면 모든 프로젝트에 대한 공통적 인 특성과 다른 일부에 대한 특정 값을 가질 수있는 두 가지 장점을 모두 얻을 수 있습니다.

    희망이 있습니다.

    +0

    이것을 처리하기 위해 빌드 구성에 35 개 이상의 항목이 있습니까? 다소 중복 된 것 같습니다. 2 개 또는 3 개의 새 프로젝트를 추가하면 버전 관리 작업에 추가 할 때까지 빌드가 중단됩니다. – D3vtr0n

    +1

    @ D3vtr0n, 왜 "빌드 구성"(그게 무슨 뜻입니까?)에 많은 항목이 필요합니까? 나는이 파일이 공유 된'Common.targets' 파일에 있을지도 모르는 MSBuild 지시어 인'Compile Include = "$ (MSBuildThisFileDirectory) .. \ Common \ CommonAssemblyInfo.cs"/>'을 통해 각 .csproj에 포함되어 있다고 가정합니다. . 예이 코드 재사용. – binki

    8

    MSBuild Community Tasks에는 assemblyInfo.cs를 생성하는 데 사용할 수있는 AssemblyInfo라는 사용자 지정 작업이 포함되어 있습니다. 사용하기 위해 csproj 파일을 약간 손으로 편집해야하지만, 가치가 있습니다.

    12

    @JRoppert가 제시하는 해결책은 내가하는 것과 거의 같습니다.

    #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)] 
    

    나는 또한 (일반적으로) 솔루션 당 하나 개의 공통 조립 정보를 하나를 사용하는 가정하에, : 유일한 차이점은 각 어셈블리에 따라 달라질 수있는 내가 로컬 AssemblyInfo.cs 파일에서 다음 줄을 넣어 것입니다 솔루션은 단일 제품 라인/출시 가능 제품입니다. 공통 어셈블리 정보 파일에는 다음이 포함됩니다.

    [assembly: AssemblyInformationalVersion("0.9.2.0")] 
    

    Windows 탐색기에서 표시되는 "ProductVersion"값을 설정합니다.

    4

    내 의견으로는 GlobalAssemblyInfo.cs를 사용하는 것이 모든 프로젝트 파일을 수정하고 모든 새 프로젝트를 수정해야한다는 점에서 기본적으로 AssemblyInfo.cs를 얻는 대신 GlobalAssemblyInfo.cs를 사용하는 것이 더 가치가있는 문제입니다.

    글로벌 값 (예 : 회사, 제품 등)을 변경하면 일반적으로 변경 사항이 너무 자주 발생하지 않으며 관리하기가 쉽지 않습니다. 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$")] 
    

    세 번째 요소는 개정 번호입니다. 네 번째 요소를 사용하여 새 파일이나 변경된 파일을 커밋하지 않은 것을 확인합니다 (네 번째 요소는 모두 OK이면 00입니다).

    그런데 버전 컨트롤에 AssemblyInfo.wcrev을 추가하고 을 사용하면 이것을 무시하면AssemblyInfo.cs이 무시됩니다.

    관련 문제