2011-05-24 46 views
43

我們正在開發一些完全依賴於JavaScript的Web應用程序(我們以前的應用程序是ASP.NET MVC,JavaScript'goodness'過度氾濫)。在Visual Studio 2010中處理常見的JavaScript文件

我們有幾個文件將被全部共享,並且將這些文件存儲在一個Common項目中,並將'Add As Link'添加到單個項目中是很好的(編譯代碼將可能) 。

很明顯,這不適用於JavaScript之類的東西,因爲該文件實際上並沒有位於正確的位置。

有沒有人對保持單個版本的共享JavaScript文件有任何建議,以便在多個項目中使用?

+0

很好的問題,我一直在思考這個問題很長一段時間。在我腦海中彈出的唯一解決方案是將這些文件託管在網絡上並使用它們,如cdn或使用符號鏈接。您可以將代碼片段添加到您的Visual Studio中以引用它們。 – Blowsie 2011-05-24 08:16:58

回答

20

最後,這是我實現它的方式。這可能不符合每個人的口味 - 但爲我工作的一種享受。

注意:在我們所有的項目中,靜態資源都位於名爲'Assets'的根目錄中,因此例如JavaScript始終位於/ Assets/js /和CSS/Assets/css /中。

解決方案

  1. 在這是要「進口」的常用代碼項目,我只需在/資產/ JS /添加公共.js文件「作爲鏈接」。
  2. 轉到該新添加的屬性,並將「複製到輸出目錄」設置爲「如果更新則複製」。
  3. 現在我只是項目的生成後事件命令行編輯爲以下內容: XCOPY/Y/E 「$(TARGETDIR)\資產」, 「$(PROJECTDIR)\資產」

當項目建立後,它將導入的文件複製到\ bin \ Assets \ js - 生成後事件然後將那些導入的文件複製到項目目錄中 - 以便網站使用它們。

+5

您可以添加/ D參數來僅複製已更改的文件:xcopy/Y/E/D「$(TargetDir)\ Assets」「$(ProjectDir)\ Assets」 – Cohen 2011-09-20 10:02:57

+2

從這個問題中最受歡迎的答案中獲得一個提示: http://stackoverflow.com/questions/3018289/xcopy-file-rename-suppress-does-xxx-specify-a-file-name-message 我修改了以下命令行:'echo f | xcopy/Y/E「$(TargetDir)Content」「$(ProjectDir)Content」,它阻止了在我的場景中出現「退出並出現代碼X」錯誤。 – robyaw 2013-01-24 14:40:04

+0

通過啓用「複製到輸出目錄」,bin文件夾將會被它們不屬於的.js文件污染。我知道您在將它們複製到\ Assets之前將它用作臨時文件夾。它們將被包含在部署中,但不會被使用。 – Bigjim 2014-04-23 12:47:44

0

也許你可以使用visual studio templates

+1

感謝您的建議,但我認爲這隻會在創建時採用「常見」代碼。之後,任何後續的代碼更改都需要在每個單獨的項目中進行。 – isNaN1247 2011-05-24 08:16:32

+0

@betwtwizzle無後顧之憂,好點。 – 2011-05-24 08:30:15

0

很好的問題,我一直在思考這個相當長的一段時間。在我腦海中彈出的唯一解決方案是將這些文件託管在網絡上並使用它們,如cdn或使用符號鏈接。您可以將代碼片段添加到您的Visual Studio中以引用它們。

1

正確的解決方案是將javascript/css文件嵌入到您的項目中。您可以通過使用WebResources.axd來完成此操作。這是microsoft在其控件中嵌入js的官方方式。 (就像驗證控件)

你可以找到一個很好的教程:http://www.4guysfromrolla.com/articles/080906-1.aspx

+3

雖然這是一個有趣的解決方案,但它不好,你需要腳本src屬性中的查詢字符串(這可能會導致一些代理失敗緩存)。更重要的是,我無法將常用資源與本地項目文件合併到一個壓縮的JS文件中 – isNaN1247 2011-05-24 19:07:20

+0

開發很少適合說「正確的解決方案」 – sclarson 2014-09-02 18:34:51

-4

使用適當的版本控制。

將js保留在一個位置,然後只要您更新了JavaScript,就可以將它們還原到您的代碼中,然後只需git pull(或等效的Mercurial/Bazaar)。

+0

我們使用TFS 2010,而且我似乎無法找到類似的功能,用於跨項目提取單個文件 – isNaN1247 2011-05-24 19:03:19

+0

@betwtwizzle我建議您將js保存在一個項目或VC位置,並將其簽入到現有代碼中。或欺騙和託管你的JS在一個混帳服務器;) – Raynos 2011-05-24 19:12:31

+0

我不知道這將如何解決這個問題?你會把它們配置成git-submodules(類似於svn:externals)嗎? – Cohen 2011-09-20 09:59:20

0

本博客文章介紹的替代解決方案的答覆@beardtwizzle:

http://consultingblogs.emc.com/jamesdawson/archive/2008/06/03/using-linked-files-with-web-application-projects.aspx

的想法是相似的:

  1. 共享的文件添加到以Web項目爲紐帶
  2. 修改項目中的_CopyWebApplication構建步驟,以便鏈接的文件被複制到正確的目標路徑。

因此,而不是後構建事件的文件被修改的構建步驟複製。對我來說,這個解決方案感覺有點清潔(但這可能是一個口味問題)。無論如何,我只是把它添加到我們的解決方案,迄今爲止效果很好!

49

我知道這個問題很古老,但仍然想提出我的解決方案,因爲它比beardtwizzle更簡單一些。

可以確保Visual Studio中複製所有鏈接的文件到您放置在Visual Studio的Solution Explorer中的鏈接通過在你的.csproj文件的末尾添加此:

<Target Name="CopyLinkedContentFiles" BeforeTargets="Build"> 
    <Copy SourceFiles="%(Content.Identity)" 
      DestinationFiles="%(Content.Link)" 
      SkipUnchangedFiles='true' 
      OverwriteReadOnlyFiles='true' 
      Condition="'%(Content.Link)' != ''" /> 
    </Target> 

我描述如何在 http://mattperdeck.com/post/Copying-linked-content-files-at-each-build-using-MSBuild.aspx

+0

謝謝!我比xcopy PostBuildEvent更喜歡這一點,因爲我的資產中有子目錄需要複製,並且不需要所有項目中的所有共享資源。這照顧他們所有! – Cody 2013-05-10 20:59:04

+0

我愛這個!不幸的是,一個小缺點是你需要在智能感知之前重新構建這些被引用的.js文件。但迄今爲止最佳解決方案。 – Bigjim 2014-04-23 13:12:04

+0

@Bigjim儘管智能感知不起作用,您是否必須構建以獲取對共享文件的最新更改,還是可以修改鏈接的JavaScript文件,並在調試時查看最新更改? – crush 2015-06-25 14:56:59

1

我也能看到這個問題是古老的,但認爲我想補充我的兩分錢在我的博客文章作品...

我有一個單獨的項目的JavaScript文件。我添加了一個鏈接引用,這對於發佈很適用,但在IIS Express或Casinni中不起作用。我試圖添加自定義路由來捕獲丟失的文件並手動重新映射它,但它有點破解,並且出於某種原因在升級到MVC 5.1時停止工作,所以我沒有修復破解,我找到了更好的方法:

System.Web.Optimization有javascript包。

在您的共享項目中,將Copy To Output Directory設置爲「始終複製」並將Build Action設置爲js文件中的「內容」。這意味着你的js文件最終在你的網站項目的bin文件夾中。它們不能從那裏提供服務(IIS不會服務於一個明顯的安全原因bin文件夾中的任何東西),但它們可以被包含在捆綁

using System.Web; 
using System.Web.Optimization; 

public class BundleConfig 
{ 
    public static void RegisterBundles(BundleCollection bundles) 
    { 
     bundles.Add(new ScriptBundle("~/bundles/externalLibrary").Include(
        "~/bin/scripts/externalLibrary.js" 
        )); 
    } 
} 

然後需要這在Global.asax文件添加到的Application_Start(註冊路由)

BundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles); 

然後用你的捆綁鏈路,這在你的剃鬚刀CSHTML旁邊:

<script type='text/javascript' src='@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/externalLibrary")'></script> 

您需要的NuGet包爲microsoft.aspnet.web.optimization

+1

我喜歡這個想法,但在捆綁關閉時不起作用(沒有設置BundleTable.EnableOptimizations),因爲它仍然試圖從bin目錄提供它們。 – Tyler 2014-10-01 16:17:31

0

任何人在未來遇到這個問題時應該知道Visual Studio中現在有共享項目來解決這個問題。通用Windows項目默認使用它們,您可以通過在此處下載並安裝VS擴展來創建自己的項目:https://visualstudiogallery.msdn.microsoft.com/315c13a7-2787-4f57-bdf7-adae6ed54450

一旦下載了擴展程序,您可以將共享項目(空白)添加到解決方案。該項目可以在Visual C#,Visual C++和JavaScript的項目模板中找到。

然後在任何適合您的文件夾結構中包含要共享到共享項目的文件。

接下來,您將在需要訪問共享文件的解決方案中的其他項目中包含共享項目作爲共享參考。右鍵單擊其他項目並選擇「添加共享項目引用」。

現在,您可以參考主項目中的共享文件,就好像共享項目中的文件存在那裏一樣。它們被編譯爲該項目的一部分。

該技術旨在用於通用應用程序在Windows Phone和Windows應用商店應用程序之間共享代碼,以便警告您可能在不同情況下共享時遇到麻煩,但值得嘗試查看它是否能滿足您的需求。

+0

你能解釋一些關於這項技術的工作原理嗎? – crush 2015-06-25 14:53:45