2012-06-13 3 views
2

게시자 정책을 만들려면 MSBuild의 <AL></AL> 작업을 실행하고 싶습니다. 이를 위해, 내 csproj 파일에서, 내가 설정 파일 이름의 목록을 만들 : 나는 단 하나 개의 버전 번호 "@(PolicyVersion"을해야하는 경우가 완벽하게 잘 작동MSBuild : 다른 소스의 정보를 하나의 작업에 병합

<Target Name="AfterBuild"> 
    <ItemGroup> 
    <ConfigFiles Include="$(TargetDir)\*.config" /> 
    </ItemGroup> 
    <AL 
     LinkResources="%(ConfigFiles.Identity)" 
     Platform="x86" 
     KeyFile="$(ProjectDir)\KeyFile.snk" 
     OutputAssembly="$(TargetDir)\%(ConfigFiles.Filename).dll" 
     Version="@(PolicyVersion)" 
    /> 
</Target> 

. 하지만 각 설정 파일마다 다른 버전 번호가 필요한 경우에는 어떻게해야합니까? 구성 파일의 XML 특성에서 버전 번호를 검색 할 수 있지만이를 수행하는 방법을 모르기 때문에 배치를 빌드하는 동안 해당 항목에 사용할 수 있습니다.

또한 다음을 시도했습니다. 설정 파일의 이름은 Policy.2.2xx.Mylib.config입니다. 이들은 프로그래밍 방식으로 생성됩니다. 나는, 버전 정보를 (각 Mylib 동일하지만 다른 libs와 다를 수 있음), 들고 Policy.2.2xx.Mylib.ver 또는 MyLib.ver 파일 내가

<ReadLinesFromFile File="$(TargetDir)\MyLib.ver"> 
    <Output TaskParameter="Lines" ItemName="PolicyVersion" /> 
</ReadLinesFromFile> 

를 사용하여 읽을 수있는 추가로 생성하지만, 내가 어떻게 할 수 이제 MyLib (또는 Policy.2.2xx.Mylib)의 버전 정보를 <AL> 작업의 해당 구성 파일과 연결 시키십시오. 나는 "%(ConfigFies.identity).ver"을 읽음으로 ItemName으로 사용하려고했다. 그때 나는이 정보를 AL taks에 넣었으므로 동일한 msbatch 루프를 참조하면서이 정보에 액세스 할 수 있었으면 좋겠지 만,이 점은 항목 이름에 점들이 맞지 않기 때문에 작동하지 않는다.

두 개의 다른 아이템 그룹에서 새 아이템 그룹을 만드는 것만 큼 쉽지만, 지금까지는이 MS Build 몬스터와 함께 충분히 경험하지 못했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

(VS 2008을 사용하고 있습니다.)

답변

2

내가 필요한 것을 정확히 이해하지 못합니다. 나는 당신이 설정 파일의 이름에서 버전 번호를 가져 와서 AL 작업의 Version 속성에 전달하려고한다고 생각합니다.

AL으로 통화를 래핑하는 대상을 만듭니다. ConfigFiles 항목 그룹에서 일괄 처리하여 새 타겟을 호출하십시오. 대상에서 문자열 메소드를 사용하여 버전 번호를 추출하십시오.

<Target Name="AfterBuild"> 
    <ItemGroup> 
     <ConfigFiles Include="$(TargetDir)\*.config" /> 
    </ItemGroup> 

    <MSBuild Projects="$(MSBuildThisFileFullPath)" 
      Properties="LinkResource=%(ConfigFiles.Filename)%(Extension)" 
      Targets="_AL" /> 
</Target> 

<Target Name="_AL"> 
    <Error Condition="'$(LinkResource)' == ''" Text="Missing LinkResource property." /> 
    <PropertyGroup> 
     <_OutputFilename>$(LinkResource.Replace('.config', '')).dll</_OutputFilename> 
     <_VersionNumber>$(_OutputFilename.Replace('Policy.',''))</_VersionNumber> 
    </PropertyGroup> 

   <AL 
     LinkResources="$(LinkResource)" 
     Platform="x86" 
     KeyFile="$(ProjectDir)\KeyFile.snk" 
     OutputAssembly="$(TargetDir)\$(_OutputFilename)" 
     Version="$(_VersionNumber)" /> 
</Target> 
+0

고맙습니다. 조용히 분명히 이런 종류의 루프에 익숙해지기 위해 약간 연습해야합니다. 이것은 내가 그것이 필요로하는 것을 할 것 인 것처럼 많이 본다 - 나는 내가 추측하는 수요일보다 일찍 이것을 시험해 볼 수 없다. 그러나 나는 약간 자신이있다. 그렇지 않더라도, 그것은 나를 시작하게 할 것입니다. '$ (LinkResource)'는 '$ (_ LinkResource)'여야합니다. 맞습니까? – Thomas

+0

이 대체 기능은 MSBuild 4.0에서만 사용할 수 있습니까? – Thomas

+0

@Thomas $ (LinkResource) 속성으로 불일치를 수정했습니다. 또한 MSBuild 4.0에서는 속성 함수 (즉 Replace 함수)가 추가 된 것으로 보입니다. 하지만 MSBuild 4.0으로 .NET 2.0 코드를 작성할 수는 있습니다. –

관련 문제