現在軟件開發已經告別了“獨行俠”的年代,而是以團隊開發爲主。一般情況下,一個解決方案都會包含多個項目,比如:其中一些是靜態庫項目,一些是動態庫項目,當然還會有應用程序項目。另外,根據需要,還可能會使用一些第三方庫。因此爲解決方案設置一個合理的目錄結構並配合一定的環境變量,不但可以使得代碼管理更井井有條,項目成員之間也更容易相互配合,更重要的是能夠使得最終應用程序的安裝包製作,源代碼打包發佈和轉移變得十分容易。
背景資料:從VC6之後VC就使用解決方案(Solution)來替代原來的工作空間,用於組織和管理多個相關的項目(Project)。
下面就以一個例子來說明怎樣一步一步的創建一個VC2005解決方案。
比如該方案名爲StepByStep。裏面共有3個工程:應用程序工程EXE,靜態庫工程LIB,和動態庫工程DLL。另外還要用到第三方的庫。
第一步,爲解決方案設計目錄結構
1. SetpBySetp是解決方案目錄
2. Bin是存放最終可發佈的生成文件的文件夾
3. Config文件夾內存放配置文件
4. Lib內是存放所有的.lib文件(lib文件夾內)和使用庫文件所需的頭文件(inc文件夾內)
5. Source內是所有工程的源代碼
6. Temp是臨時文件夾,存放中間文件(Intermediate)和輸出文件(Output文件夾)
第二步,爲解決方案編寫啓動批處理文件(.bat)
rem -- This .bat file is used to start the solution
rem -- These variables can be changed as you need
set VIRTUALDIRVE=S:
set REALPATH=D:/StarLee
@echo Create the virtual dirve ...
if not exist %VIRTUALDIRVE% subst %VIRTUALDIRVE% %REALPATH%
@echo -- Success!
@echo.
@echo Set develop environment variables ...
set SOLUTIONNAME=StepByStep
set ROOT=%VIRTUALDIRVE%/%SOLUTIONNAME%
set BIN=%ROOT%/Bin
set CONFIG=%ROOT%/Config
set LIB=%ROOT%/Liblib
set SOURCE=%ROOT%/Source
set TEMP=%ROOT%/Temp
set OUTPUT=%TEMP%/Output
set INTERMEDIATE=%TEMP%/Intermediate
@echo -- Success!
@echo.
@echo Open solution in VS.Net IDE ...
if not exist %SOURCE%/%SOLUTIONNAME%.sln goto ERROR_NOT_FOUND_SOLUTION_FILE
devenv %SOURCE%/%SOLUTIONNAME%.sln
@echo -- Success!
goto END
:ERROR_NOT_FOUND_SOLUTION_FILE
@echo ERROR: Not found the solution file!
goto END
:END
可以將該批處理文件放在解決方案根目錄下。
該批處理文件分爲3個部分:
1. 設置虛擬盤
文件中是把D:/StarLee設置成了虛擬盤S:,這樣做的好處是可以方便的訪問解決方案中的各個文件,便於管理。
背景資料:subst命令可以將一個目錄設置爲一個虛擬盤。詳細信息可以參照subst的幫助信息。
2. 設置環境變量
在這裏設置的環境變量會在工程的屬性設置中用到。
3. 啓動解決方案
調用VS的devenv來在VS的IDE裏面打開解決方案。
使用方法:
在開始菜單中打開“Microsoft Visual Studio 2005”,選擇“Visual Studio Tools”,點擊“Visual Studio 2005 Command Prompt”,然後在彈出的Command窗口中執行該批處理文件,就可以直接在VS的IDE裏面打開解決方案。
在軟件開發的時候,一般都會使用版本控制程序(如VSS,Perforce等)來對源代碼進行管理,代碼以及目錄結構都會存放在服務器上。如果目錄結構需要改變,那麼針對每個客戶端上的開發者來說,重新構建開發目錄結構是一個很麻煩的事情。而有了上面這個批處理文件,一切都變的容易了,只要修改這個批處理文件中的環境變量就行了。每個開發人員都可以根據自己的情況來修改文件中第一部分的VIRTUALDIRVE和REALPATH,再加上後面兩步中的方法,就可以避免重新構建開發目錄。
第三步,爲解決方案創建一個Project Property Sheet
1. 在VS的IDE菜單中選擇“View”,然後選擇“Property Manager”。
2. 在Property Manager中用嚮導創建一個Project Property Sheet。將創建出的Project Propery Sheet存放在Config文件夾內(本例中該文件爲StepByStep.vsprops)。
3. 編輯“Gerneral”選項頁中的“Output Directory”和“Intermediate Directory”屬性。分別輸入$(OUTPUT)和$(INTERMEDIATE)。
4. 編輯“Post-Build Event”選項頁中的“Command Line”屬性。輸入下面的命令:
copy $(OUTPUT)/*.dll $(BIN)
copy $(OUTPUT)/*.exe $(BIN)
copy $(OUTPUT)/*.lib $(LIB)
5. 保存Project Property Sheet。
這裏用到了在第二步中的批處理文件裏面創建的環境變量。如果目錄結構改變,只要修改批處理文件即可,不需要修改項目文件。
Project Property Sheet其實就是一個項目屬性模板。
一個解決方案中的各個項目的屬性設置中有很多都是相同的,可以把這些相同的屬性都存放在一個Project Property Sheet裏,然後讓每個項目中這些相同的屬性繼承自這個Project Property Sheet。那樣當這些相同的屬性需要改變的時候,只要改變Project Property Sheet文件就行了,而不用一個一個項目的改變。而且,一個Project Property Sheet還可以從另外一個Project Property Sheet繼承。這跟面向對象中類的繼承是一樣的。
其實,Project Property Sheet對應的.vsprops就是一個XML文件。本例中StepByStep.vsprops文件的內容如下:
<VisualStudioPropertySheet
ProjectType="Visual C++"
Version="8.00"
Name="StepByStep"
OutputDirectory="$(OUTPUT)"
IntermediateDirectory="$(INTERMEDIATE)"
>
<Tool
Name="VCPostBuildEventTool"
CommandLine="copy $(OUTPUT)*.dll $(BIN)
copy $(OUTPUT)*.exe $(BIN)
copy $(OUTPUT)*.lib $(LIB)
"
/>
</VisualStudioPropertySheet>
第四步,讓解決方案中的各個項目屬性從Project Property Sheet繼承
1. 打開項目的屬性頁,將“Configuration”改爲“All Configurations”,以使屬性的修改對所有配置都有效。在“Inherited Project Property Sheet”中輸入$(CONFIG)/StepByStep.vsprops。
2. 選擇要從Project Property Sheet繼承的屬性,在下拉框中選擇“<inherit from parent or project defaults>”,然後點擊“Apply”按鈕就行了。
通過上面四步,就創建了一個完整的,有合理目錄的,非常便於管理的VC2005解決方案。在需要發佈的時候,只要在Release配置下進行編譯,然後將Bin文件夾內的文件打包即可。
其實,上面的例子只是一個很小的解決方案。在一些中型或者大型的軟件開發過程中,解決方案肯定比這個要龐大很多,相關的目錄結構和配置也會複雜很多,那樣就更能體現出上面的方法和步驟的優點。