2013-07-16 2 views
3

FinalEdit : 첫 번째 게시물에서 관련 디렉토리가 작동하지 않지만, Exec 라인에서 $(MsBuildThisFileDirectory)을 삭제하면 제대로 작동합니다.MSBuild를 사용하여 AssemblyVersion을 파일에 작성하는 방법은 무엇입니까?

편집 2 : 새 대상을 DefaultTargets에 추가했습니다. 이제 기본적으로 실행됩니다. 그러나 postbuild 명령으로 타이밍이 해제되었습니다. 대상에 <Exec Command="call $(MsBuildThisFileDirectory)documentation\tools\GenerateDocumentation.bat" IgnoreExitCode="false" />을 추가했지만 실제로는 C:\Users\my program\documentation\tools\GenerateDocumentation.bat 인 공백으로 인해 C:\Users\my이 유효한 배치 파일이 아니라는 오류가 발생합니다. 경로 주위에 따옴표를 쓰면 MSB4025이라는 오류 메시지가 나타나며 이름은 $으로 시작할 수 없습니다.

편집 : 나는 stijn의 코드를 시도했으며 명시 적으로/t : RetrieveIdentities를 사용하여 명령 줄에서 실행할 때 작동하지만 다른 이유로는 실행되지 않는 것으로 보입니다.

나는 소스 코드에 대한 문서를 생성하기 위해 Doxygen을 사용하고 있지만 자동으로 처리 할 수 ​​있기를 바란다. .bat 스크립트를 작성하여 Doxygen을 원하는 설정 파일로 실행하고 .chm 도움말 파일로 출력을 컴파일했지만 Doxygen에서 개정 번호를 자동으로 변경할 수 없었습니다.

MSBuild를 사용하여 새 개정 번호가있는 구성 파일에 새로운 행을 추가하여 구성 파일을 간단히 갱신하려고 시도했지만 인쇄 할 항목을 얻지 못했거나없는 경우 새 파일을 작성했습니다. .

내가 지금까지 가지고있는 코드는 다른 비슷한 질문에서 얻은 것이지만 작동시키지 못합니다.

<ItemGroup> 
    <MyTextFile Include="\documentation\DoxygenConfigFile.doxyconfig"/> 
    <MyItems Include="PROJECT_NUMBER   = %(MyAssemblyIdentitiesAssemblyInfo.Version)"/> 
</ItemGroup> 
<Target Name="RetrieveIdentities"> 
    <GetAssemblyIdentity AssemblyFiles="bin\foo.exe"> 
    <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities"/> 
    </GetAssemblyIdentity> 
    <WriteLinesToFile File="@(MyTextFile)" Lines="@(MyItems)" Overwrite="false" Encoding="UTF8" /> 
</Target> 
+1

미래에는 "작동하지 않는다"는 메시지가 msbuild 출력/오류 등을 포함하도록 분명하지 않습니다. 또한 게시자가 게시 한 스크립트 코드를 복사/붙여 넣기하고 실행하고 잘못된 내용을 볼 수 있어야합니다. – stijn

답변

1
  1. Encoding 잘못, 그것은 항목/속성을 사용하여 작업하는 경우 UTF-8
  2. 이 (가) %@$ 바로 ( 앞에 와야합니다 있어야에는 간격없는 사이 : %(MyAssemblyIdentitiesAssemblyInfo.Version)
  3. MyAssemblyIdentitiesAssemblyInfo 존재하지 않는다면 아마도 의미가 있습니다. MyAssemblyIdentities
  4. msbuild가 속성과 항목을 평가하는 방법을 찾습니다. 기본적으로 스크립트에서 수행 할 작업은 MyItems이지만 그 당시 MyAssemblyIdentities은 아직 존재하지 않으므로 비어 있으며 그 후에 만 ​​GetAssemblyIdentity이 실행됩니다. 올바른 평가 순서를 적용하여이 문제를 해결하십시오. 대상을 대상 안에 넣고 항목을 평가하기 전에 을 만드는 다른 대상에 종속되도록합니다.

은 요약하면 : 당신이 잘못 될 것입니다 스크립트이고, 디렉토리에 msbuild를 호출 다른 경로 (문서/foo는) 경우

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<Target Name="GetAssemblyIdentities"> 
    <GetAssemblyIdentity AssemblyFiles="bin\foo.exe"> 
    <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities"/> 
    </GetAssemblyIdentity> 
</Target> 

<Target Name="RetrieveIdentities" DependsOnTargets="GetAssemblyIdentities"> 
    <ItemGroup> 
    <MyTextFile Include="\documentation\DoxygenConfigFile.doxyconfig"/> 
    <MyItems Include="PROJECT_NUMBER = %(MyAssemblyIdentities.Version)"/> 
    </ItemGroup> 
    <WriteLinesToFile File="@(MyTextFile)" Lines="@(MyItems)" 
        Overwrite="false" Encoding="UTF-8" /> 
</Target> 

</Project> 

참고이에만 작동합니다. 예 : $(MsBuildThisFileDirectory)\bin\foo.exe을 사용하여 해결할 수 있습니다.

+0

1. 나는 원래 그것을 시도했지만 차이를 만들지 않았다. 2. 죄송합니다. 붙여 넣기를 엉망으로 만들었을 것입니다. 코드에서 맞습니다. 3. 나는 완전히 그것을 놓쳤다. 어떤 이유인지 그것은 여전히 ​​파일에 인쇄되지 않습니다. 디렉토리의 파일 이름을 변경하면 MSBuild가 오류를 발견하지 못합니다. 그렇지 않으면 오류가 발견되지 않고 파일에 아무것도 인쇄되지 않습니다. 감사합니다. –

+0

1. 올바른 인코딩이 없으면 오류 MSB3098 : "WriteLinesToFile"태스크가 "인코딩"매개 변수에 대해 잘못된 값을 받았습니다. 어쨌든 필자는 위의 내용을 내 시스템에서 테스트했으며 예상대로 작동하므로 작동하지 않으면 더 많은 정보를 제공해야합니다. 시도한 내용과 결과물을 정확히 설명하는 질문을 업데이트하십시오. 또한 msbuild에서 작동하지 않는 경우 디버깅 도구로 속성/항목의 값을 표시하려면' "를 사용하십시오. – stijn

+0

마침내'Exec' 명령을 작동시키는 방법을 알아 냈습니다. 원래 예제에서 상대 경로를 사용할 수없는 이유를 알고 계시지만 Command 명령에 사용해야합니다. 도움 주셔서 감사합니다. –

관련 문제