Web Project的檔案共用小技巧

有時Web Project會有一些檔案在不同專案間共同使用,如Javascript檔、圖檔、第三方套件等等,如果每一個專案都放置一份,很容易照成維護上的麻煩(如修改A專案的檔案,忘了複製到B專案),這時可以調整一下檔案的結構與修改一下專案的設定來解決這問題(這是小弟最近建方案的心得,不一定是最好的)。

有時Web Project會有一些檔案在不同專案間共同使用,如Javascript檔、圖檔、第三方套件等等,如果每一個專案都放置一份,很容易照成維護上的麻煩(如修改A專案的檔案,忘了複製到B專案),這時可以調整一下檔案的結構與修改一下專案的設定來解決這問題(這是小弟最近建方案的心得,不一定是最好的)。

 

資料夾結構

可以在方案下建立一個方案內專案共用的資料夾,專門放置通用的檔案。

image

通用檔案的版本管理

通用檔案可以放在方案下,簽出簽入以方案內為主,但缺點是檔案的用共只能分享在方案中的專案間,其實可以將共用檔案存放在一個版本管理的特定路徑下,在用工具做同步,如:

  • SVN的 svn:externals
  • TFS的 工具區設定多資料夾

等方式將方案所需的檔案放在方案資料夾中。

 

假設在TFS或SVN中以下列方式建立,shared(通用資料夾)是平行於方案的。

image

 

 

在SVN中在Checkout的方案資料夾上增加svn:externals屬性,讓工具簽出方案時一並簽出Shared資料夾,並修改後可簽入。

image

 

在TFS中工作區增加Shared的Map,讓工具簽出方案時一並簽出Shared資料夾,並修改後可簽入。

image

 

以Add As Link方式新增檔案

在各專案中以Add As Link的方式將檔案加入通用檔案(以Add As Link加入專案的檔案的圖示會多一個連結符號),當修改時是修改同一份檔案,並可以簽入讓所有方案都使用最新的檔案。

image

 

如範例的二個專案中的JS是共用小弟寫多年的檔案,因為都是修改同一份,不會因為複製到不同專案中,因為修改而造成版本的混亂。

image

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都還沒發現問題,有興趣的朋友可以試試看。

 

 

參考資料

svn:externals說明

HOW TO:加入現有項目至專案

MSBuild Target