4

나는 해결책을 포함, 다수의 프로젝트로 구성된이 있습니다업데이트 .NET 프로젝트 참조는

Foo.Bar.Client
Foo.Common

Foo.Bar.ClientFoo.Common의 구성 요소에 따라 달라집니다. 그리고 Foo.Common에는 자체 구성 파일이 없습니다. 그 설정은 그것을 사용하는 클라이언트 응용 프로그램의 설정 파일에 저장됩니다 (이 경우 Foo.Bar.Client).
따라서, Foo.Bar.Client에 대한 설정 파일이

<configSections> 
    <section name="BletchConfiguration" 
      type="Foo.Common.Bletch, Version=1.1.0.0, ..."/> 
    .... 
    </configSections> 

나는 "개정"부분은 최신 변화 설정 (우리의 경우에 HEAD 개정 번호에 해당 있도록 우리의 버전 번호를 조정하는 임무 봤는데 포함, 우리가 Subversion을 사용함에 따라) "1.1.0.0"에서 "1.1.0.12345"로 변경됩니다.

그래서 "here"과 같이 "공유"어셈블리 버전 정보 모듈을 구현했습니다. 그리고 NAnt 빌드 스크립트를 수정하여 버전 번호를 가져 와서 공유 어셈블리 정보 파일을 업데이트했습니다.

그러나 구성 파일에 포함 된 버전 번호는 계산하지 않았습니다. 구성 파일에서 버전 번호를 자동으로 업데이트하는 (상대적으로) 고통없는 방법이 있습니까?

"공통"어셈블리를 별도의 솔루션으로 분리 할 수 ​​있습니다.
또한 IoC를 사용하여 공통 구성 요소를 구성 할 수 있으므로 어셈블리 관련 구성 섹션이 필요하지 않습니다.
그러나 이러한 접근 방식 중 일부는 위험과 시간을 필요로합니다 ... 둘 다 가능한 힘을 피하는 것이 더 좋습니다.

답변

2

빠른 답변 - 응용 프로그램에 Foo.Common.dll의 여러 동시 버전을 지원하지 않으면 구성 섹션에서 버전 번호를 생략하기 만하면됩니다.

이 설정 파일 구조의 '섹션'영역에 특별하지 않다
<configSections> 
    <section name="BletchConfiguration" 
     type="Foo.Common.Bletch, Foo.Common"/> 
    .... 
</configSections> 

-이 고유 그물 일 - 그리고 규칙은 모든 것을 사용했다.

I 구체적되는 부분이 선택적 관련된 모든 문서를 찾을 수

[EDIT]. MSDN 문서는 단순히 (그것은 매우 유연 - 대괄호는 선택을 의미) ... 메모리와 약간의 실험에서, http://msdn.microsoft.com/en-us/library/ms228245.aspx 그러나 구조를 명시하여 DLL이 GAC에있는 경우

- 당신은 버전 ... 이 필요합니다 당신의 DLL은 응용 프로그램에서보고 무엇을 조립 알 필요가 있기 때문에 FullTypeAndNamespace, AssemblyNameWithoutExtension [,Version, Culture, PublicKeyToken] [,PlatformType]

은 따라서 처음 두 부분은 필수 bin 디렉토리에있는 경우 FullTypeAndNamespace, AssemblyNameWithoutExtension, Version, Culture, PublicKeyToken [,PlatformType]

는, 유형에 당신은 지정했습니다.

임의의 순서로 임의의 구성 요소를 가질 수 있습니다 (키 = 값 쌍으로 구성되어 있기 때문에 순서는 중요하지 않음). 제한하려는 요소를 지정하고 나머지는 생략하십시오.

따라서 위의 예제에서 CLR은 이름과 일치하는 첫 번째 DLL을로드하고 필요한 형식을 포함합니다.

+0

하는 당신은 할 수 없을 것을 여기

실제 AssemblyVersion를 업데이트 할 수있는 스크립트입니다 어떤 문서를 가르쳐 주겠습니까? 나는 그 라인들을 따라 생각하고 (그리고 검색하고있다.) 그러나'type '의 어떤 부분이 생략 될 수 있는지를 가리키는 것을 발견하지 못했다. – David

+0

귀하의 질문에 답변하기 위해 제 답변을 업데이트했습니다. – Adam

1

자주 AssemblyVersion을 개정하지 않겠습니다. 각 빌드마다 AssemblyFileVersion을 수정해야합니다 (따로 구분할 수 있도록)하지만 AssemblyVersion을 각 빌드로 다시 작성하는 것은 상당히 문제가 있습니다.

What are differences between AssemblyVersion, AssemblyFileVersion and AssemblyInformationalVersion?

편집 : 나는 AssemblyVersion를 업데이트해야 할 때, 나는, 수정해야 할 파일을 찾아 그들을 확인하고 변경하는 PowerShell 스크립트를 실행합니다. 파일의 하위 집합을 확인한 후 수동으로 변경 사항을 제출합니다.

get-childitem . -rec -include AssemblyInfo.cs | select-string "assembly: AssemblyVersion(" -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "assembly: AssemblyVersion\(`"\d\.\d\.\d\.\d", "assembly: AssemblyVersion(`"2.0.0.0" } | set-content $_.Path -Encoding UTF8 } 
다음

하나는 1.5.0.0에서 2.0.0.0에 대한 프로젝트 참조 업데이트하는 것입니다 :

get-childitem . -rec -include *.csproj | select-string "<Reference Include=`"Acme.SomeProduct," -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "<Reference Include=`"Acme\.SomeProduct, Version=1\.5\.0\.0,", "<Reference Include=`"Acme.SomeProduct, Version=2.0.0.0," } | set-content $_.Path -Encoding UTF8 } 
+0

나는 이것에도 동의한다. 빌드 당 파일 버전을 개정하고 릴리스 할 때 어셈블리 ID 만 변경합니다. 그러나 얼마나 자주 변경했는지에 관계없이 구성에 버전 번호가 있으면 아마 어느 시점에서 사용자를 알 수 있습니다. Suzanne Cooke는 릴리스에서 개발을 시작하기 전에 어셈블리 버전을 변경하는 것이 좋습니다 (http://blogs.msdn.com/b/suzcook/archive/2003/05/29/when-to-change-file-assembly). -versions.aspx)를 사용하면 응용 프로그램의 동작에 영향을 미칩니다. – Adam

+0

많은 의미가 있습니다. 불행하게도'.config' 참조 중 일부는 네 부분으로 된 어셈블리 버전 번호 (예 : major.minor.build.revision)가 필요한 (구형) Enterprise Library 블록으로 전달됩니다. – David

+0

@Russell - 응답 해 주셔서 감사합니다 ... "받아 들여"라는 대답을 선택하는 데 정말 어려움을 겪었습니다. PowerShell-fu에 경외감을 느낍니다. – David