2008-08-28 31 views
4

我剛剛使用繼承的屬性表爲我們現有的C++代碼建立了一個不合適的構建系統,這個功能似乎是特定於Visual C++產品的。不適當的建築需要改變許多項目設置,並且繼承的屬性頁允許我通過將屬性表附加到項目來更改所有必要的設置。我正在將我們的團隊從用於UI的C++/MFC遷移到C#和WPF,但我需要提供相同的不適合的構建功能,希望能夠提供相同的便利。我似乎無法找到一種方法來處理C#項目 - 我首先查看了是否可以引用MsBuild目標文件,但找不到方法來執行此操作。我知道我可以在整個事情上使用MsBuild,但這似乎比必要的更復雜。有沒有一種方法可以爲目錄定義一個宏,並在輸出路徑中使用它,例如?使用C#編寫不合適的版本

回答

3

我不太確定什麼是「不適用」構建系統,但是如果您只需要將編譯文件(或其他資源)複製到其他目錄的功能,您可以通過綁定到MSBuild構建目標。

在我們的項目中,我們將編譯的DLL移動到lib文件夾中,並在構建完成後將文件放入適當的位置。爲此,我們創建了一個自定義構建.target文件,該文件創建了TargetPropertyItemGroup,然後我們使用該文件填充我們的外部輸出文件夾。

我們的定製目標文件看起來有點像這樣:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <ProjectName>TheProject</ProjectName> 
     <ProjectDepthPath>..\..\</ProjectDepthPath> 
     <ProjectsLibFolder>..\..\lib\</ProjectsLibFolder> 

     <LibFolder>$(ProjectsLibFolder)$(ProjectName)\$(Configuration)\</LibFolder> 
    </PropertyGroup> 

    <Target Name="DeleteLibFiles"> 
     <Delete Files="@(LibFiles-> '$(ProjectDepthPath)$(LibFolder)%(filename)%(extension)')" TreatErrorsAsWarnings="true" /> 
    </Target> 
    <Target Name="CopyLibFiles"> 
     <Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ProjectDepthPath)$(LibFolder)" SkipUnchangedFiles="True" /> 
    </Target> 

    <ItemGroup> 
     <LibFiles Include=" "> 
      <Visible>false</Visible> 
     </LibFiles> 
    </ItemGroup> 
</Project> 

Visual Studio中的.csproj文件,然後用此自定義目標文件集:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" ... > 
    ... 
    <Import Project="..\..\..\..\build\OurBuildTargets.targets" /> 
     <ItemGroup> 
     <LibFiles Include="$(OutputPath)$(AssemblyName).dll"> 
      <Visible>false</Visible> 
     </LibFiles> 
     </ItemGroup> 
    <Target Name="BeforeClean" DependsOnTargets="DeleteLibFiles" /> 
    <Target Name="AfterBuild" DependsOnTargets="CopyLibFiles" /> 
</Project> 

簡而言之,這個構建腳本首先告訴MSBuild加載我們的自定義構建腳本,然後將編譯後的文件添加到LibFiles ItemGroup中,最後將我們的自定義構建目標DeleteLibFilesCopyLibFiles綁定到構建過程中。我們爲我們的解決方案中的每個項目設置了這一點,以便只更新的文件被刪除/複製,並且每個項目都負責它自己的文件(dll,圖像等)。

我希望這會有所幫助。我很抱歉,如果我誤解了你的意思是不適當的構建系統,這對你來說完全沒用!

0

有沒有一種方法,我可以定義一個宏的目錄,並在輸出路徑

你看着在預構建和生成後一個項目的事件使用它?

0

實際上,預生成和生成後事件似乎只是一個添加批處理文件類型命令的地方。這不利於我爲我們的項目建立標準的構建目錄。並且讓這些事件創建批處理文件對於像C#,IMO這樣的現代語言來說似乎是一種非常1980年的方法。

挖掘更多內容並進行實驗後,我發現您可以將一個<導入>指令添加到.csproj文件中。當你這樣做時,IDE會彈出一個警告對話框,提示項目中存在一個不安全的入口點 - 但是你可以忽略這一點,顯然,你可以通過編輯一個註冊表項使它完全不出現。所以這會給我一種方法來獲取包含我需要的目錄路徑的變量到.csproj文件中。

現在得到輸出路徑來引用它 - 不幸的是,當你在輸出路徑字段中添加一個像「$(MySpecialPath)/ Debug」這樣的字符串並保存項目時,$和()字符被轉換爲十六進制,並且您的文件將放入名爲「$(MySpecialPath)」的目錄下的Debug目錄中。 Arrgghh。如果您在文本編輯器中編輯.csproj文件,則可以正確設置它,但只要標籤出現在包含輸出路徑的<PropertyGroup>之前,它似乎就可以工作。

所以我認爲我的解決方案將創建一個標準的OurTeam.targets MsBuild文件在一個標準的位置,添加一個安裝程序更改註冊表,因此它不會標記警告,然後創建自定義項目模板<導入>此文件,並將輸出路徑設置爲使用OurTeam.targets文件中定義的屬性。不幸的是,這比C++中的屬性表繼承機制更加出色並且不太優雅。