有時Web Project會有一些檔案在不同專案間共同使用,如Javascript檔、圖檔、第三方套件等等,如果每一個專案都放置一份,很容易照成維護上的麻煩(如修改A專案的檔案,忘了複製到B專案),這時可以調整一下檔案的結構與修改一下專案的設定來解決這問題(這是小弟最近建方案的心得,不一定是最好的)。
有時Web Project會有一些檔案在不同專案間共同使用,如Javascript檔、圖檔、第三方套件等等,如果每一個專案都放置一份,很容易照成維護上的麻煩(如修改A專案的檔案,忘了複製到B專案),這時可以調整一下檔案的結構與修改一下專案的設定來解決這問題(這是小弟最近建方案的心得,不一定是最好的)。
資料夾結構
可以在方案下建立一個方案內專案共用的資料夾,專門放置通用的檔案。
通用檔案的版本管理
通用檔案可以放在方案下,簽出簽入以方案內為主,但缺點是檔案的用共只能分享在方案中的專案間,其實可以將共用檔案存放在一個版本管理的特定路徑下,在用工具做同步,如:
- SVN的 svn:externals
- TFS的 工具區設定多資料夾
等方式將方案所需的檔案放在方案資料夾中。
假設在TFS或SVN中以下列方式建立,shared(通用資料夾)是平行於方案的。
在SVN中在Checkout的方案資料夾上增加svn:externals屬性,讓工具簽出方案時一並簽出Shared資料夾,並修改後可簽入。
在TFS中工作區增加Shared的Map,讓工具簽出方案時一並簽出Shared資料夾,並修改後可簽入。
以Add As Link方式新增檔案
在各專案中以Add As Link的方式將檔案加入通用檔案(以Add As Link加入專案的檔案的圖示會多一個連結符號),當修改時是修改同一份檔案,並可以簽入讓所有方案都使用最新的檔案。
如範例的二個專案中的JS是共用小弟寫多年的檔案,因為都是修改同一份,不會因為複製到不同專案中,因為修改而造成版本的混亂。
NOTE:
VSCommands 2010有提供,Copy Link與Paste Link的功能,可以減少一點點的操作。
修改專案檔
Web Project的MS Build預設設定是不複製Link Content到專案中,這樣就以Link加入專案就會出現問題,因為當按下F5執行時,是無法正常執行的,因為找不到檔案,所以要修改MS Build的設定,當發生編譯時,複製檔案到連結檔案的所在。
在*.csproj檔中增加下_CopyWebApplication Target
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--增加_CopyWebApplication的Target,因為一個Target只能存在一個地方,所以除了增加自己的設定外,也要包含原始設定-->
<Target Name="_CopyWebApplication" DependsOnTargets="$(_CopyWebApplicationDependsOn)">
<Copy SourceFiles="@(Content)" Condition=" '$(IsDesktopBuild)' != 'false' And '%(Content.Link)' != '' "
DestinationFiles="$(ProjectDir)%(Content.Link)" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
<CallTarget Condition=" '!$(Disable_CopyWebApplication)' And '$(OutDir)' != '$(OutputPath)' And '$(OnAfter_CopyWebApplication)' != ''"
Targets="$(OnAfter_CopyWebApplication)" RunEachTargetSeparately="true" />
</Target>
</Project>
NOTE:
此方法僅適用Web Project,不適用Web Site。
實行結果
這方式在小弟的專案實行一陣子了,用起來沒什麼問題,我們的開發環境是
Visual Studio 2010
Visual Studio TFS 2010
本機的Build、TFS的Build、Publish都還沒發現問題,有興趣的朋友可以試試看。