어셈블리 속성을 사용하는 가장 좋은 방법은 무엇입니까?


163

여러 프로젝트가있는 솔루션이 있습니다. 솔루션 전체 어셈블리 정보 파일 하나를 연결하여 AssemblyInfo.cs 파일을 최적화하려고합니다. 이를위한 모범 사례는 무엇입니까? 솔루션 전체 파일에 어떤 속성이 있어야하며 프로젝트 / 어셈블리에 특정한 속성은 무엇입니까?


편집 : 관심이 있다면 후속 질문 이 있습니다. AssemblyVersion, AssemblyFileVersion 및 AssemblyInformationalVersion의 차이점은 무엇입니까?

답변:


207

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를 추가 할 수 있습니다.

  • 프로젝트의 상황에 맞는 메뉴에서 추가 / 기존 항목 ... 을 선택 하십시오.
  • GlobalAssemblyInfo.cs를 선택하십시오.
  • 오른쪽에있는 작은 아래쪽 화살표를 클릭하여 추가 단추를 확장하십시오.
  • 버튼 드롭 다운 목록에서 "링크로 추가"를 선택하십시오.

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

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

1
AssemblyCultureAttribute더 나은 설명 이 필요합니다. 이 속성은 위성 어셈블리가 아닌 경우에는 완전히 없어야합니다. 위성 어셈블리를 대규모로 사용하는 경우 두 가지 수준의 어셈블리 정보 파일 (이 경우 문화 만 지정하는 글로벌, 기본 어셈블리 및 위성 어셈블리)이 아닌 3 개 레벨이 필요할 수 있습니다.
Jirka Hanika

20

필자의 경우 우리는 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가 각 어셈블리에 내장되어 있습니다. 이를 통해 모든 프로젝트에 공통적 인 속성을 부여하고 일부는 다른 가치를 부여 할 수 있습니다.

희망이 도움이됩니다.


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

1
@ D3vtr0n, 왜 "빌드 구성"(무엇을 의미합니까)이 많은 항목이 필요합니까? 이 파일은 <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>공유 Common.targets파일 에있을 수있는 MSBuild 지시문 인 각 .csproj through에 포함되어 있다고 가정 합니다. 예 코드 재사용.
binki

15

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

또한 하나의 솔루션이 단일 제품 라인 / 릴리스 가능한 제품이라는 가정하에 솔루션 당 하나의 공통 어셈블리 정보를 (일반적으로) 사용합니다. 공통 어셈블리 정보 파일에는 다음이 포함됩니다.

[assembly: AssemblyInformationalVersion("0.9.2.0")]

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


8

MSBuild 커뮤니티 작업 에는 assemblyinfo.cs를 생성하는 데 사용할 수있는 AssemblyInfo라는 사용자 지정 작업이 포함되어 있습니다. 사용하려면 csproj 파일을 약간 수동으로 편집해야하지만 가치가 있습니다.


6

내 의견으로는 GlobalAssemblyInfo.cs를 사용하는 것이 가치가있는 것보다 더 문제가됩니다. 모든 프로젝트 파일을 수정하고 모든 새 프로젝트를 수정 해야하는 반면 기본적으로 AssemblyInfo.cs를 가져 오기 때문입니다.

글로벌 가치 (예 : 회사, 제품 등)에 대한 변경은 일반적으로 드물고 관리하기가 쉽지 않으므로 DRY 를 고려해야하는 것은 아닙니다 . 모든 프로젝트의 값을 일회성으로 수동으로 변경 하려면 다음 MSBuild 스크립트 ( 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>

3

여러 프로젝트간에 파일을 공유하기 위해 기존 파일을 링크로 추가 할 수 있습니다.

이렇게하려면 기존 파일을 추가하고 파일 선택기에서 "링크로 추가"를 클릭하십시오. (출처 : free.fr )링크로 추가

공유 파일에 넣을 내용은 어셈블리간에 공유 할 것을 넣는 것이 좋습니다. 저작권, 회사, 아마도 버전과 같은 것들.


1

여러 프로젝트에 단일 AseemblyInfo.cs 파일을 사용하지 않는 것이 좋습니다. AssemblyInfo 파일에는 해당 특정 어셈블리에만 관련 될 수있는 정보가 포함되어 있습니다. 가장 명백한 두 가지 정보는 AssemblyTitleAssemblyVersion입니다.

더 나은 솔루션은 targets둘 이상의 프로젝트에 어셈블리 속성을 "주입"하기 위해 MSBuild에서 처리 하는 파일 을 사용 하는 것입니다.


20 개 이상의 프로젝트가있는 경우 어떻게합니까? 버전 관리를 위해 빌드 구성에서 20 개 이상의 항목을 유지 관리해야합니다. 정말 절름발이입니다. 2 ~ 3 개의 새 프로젝트를 추가하면 어떻게됩니까? 그것은 확실히 빌드 프로세스를 깨뜨릴 것입니다 ... 어떻게 아이디어를 해결할 수 있습니까?
D3vtr0n

@ D3vtr0n 아이디어는 관련 어셈블리를 동적으로 생성하고 각 프로젝트에 대해 개별 구성을 유지하지 않는 것입니다. 커뮤니티 작업은 그 경우를 처리한다고 생각합니다.
로마

1

내가 찾은 유용한 것 중 하나는 빌드 전 단계에서 토큰 대체를 적용하여 AssemblyVersion 요소 등을 생성하는 것입니다.

TortoiseSvn을 사용하고 SubWCRev.exe템플릿을 AssemblyInfo.wcrev로 변환 하는 데 사용하기 쉽습니다 AssemblyInfo.cs. 템플릿의 관련 줄은 다음과 같습니다.

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

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

그건 그렇고, AssemblyInfo.wcrev버전 컨트롤에 추가 하고 이것을 사용하면 무시 AssemblyInfo.cs 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.