2013-07-16 44 views
3

FinalEdit:儘管相關目錄在第一篇文章中不起作用,但如果我只是從Exec行中刪除了$(MsBuildThisFileDirectory),它就可以工作。如何使用MSBuild將AssemblyVersion寫入文件?

編輯2:我將新目標添加到DefaultTargets。現在它默認運行它們。但是,時間安排現在與postbuild命令關閉。我添加了<Exec Command="call $(MsBuildThisFileDirectory)documentation\tools\GenerateDocumentation.bat" IgnoreExitCode="false" />到目標,但它給出了一個錯誤,C:\Users\my不是有效的批處理文件,因爲實際上是C:\Users\my program\documentation\tools\GenerateDocumentation.bat的空間。將報價放在路徑附近會導致錯誤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得到執行。通過強制執行正確的評估順序來解決此問題:將您的物品放入目標物中,並使其在依據另一個目標物創建MyAssemblyIdentities,然後再評估物品。

總結:

<?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> 

注意,如果你調用的MSBuild的目錄中的腳本,否則路徑(文檔/富)將是錯誤的,這隻會工作。這可以通過使用例如$(MsBuildThisFileDirectory)\bin\foo.exe

+0

1.我原本試過,似乎沒有區別。 2.對不起,我一定弄錯了粘貼,它在代碼中是正確的。 3.我完全錯過了。 由於某些原因,它仍未打印到文件中。當我更改目錄中文件的名稱時,MSBuild會拋出一個錯誤,指出找不到該文件,否則不會發現錯誤,也不會將任何內容打印到文件中。 謝謝! –

+0

1.如果沒有正確的編碼,錯誤消息是錯誤MSB3098:「WriteLinesToFile」任務接收到「Encoding」參數的無效值?無論如何,我在我的系統上測試了上述內容,並且它按預期工作,所以如果它不起作用,您將不得不提供更多信息。請更新您的問題,確切地說明您嘗試了什麼,以及輸出是什麼。另外如果事情在msbuild中不起作用,使用''來顯示屬性/項目的值作爲調試幫助。 – stijn

+0

我終於想出瞭如何讓'Exec'命令起作用。你知道爲什麼我不能在我的原始示例中使用相對路徑,但必須將它用於「命令」? 感謝您的幫助! –

相關問題