如何在一个解决方案中共享多个项目中的脚本?

时间:2011-12-16 21:21:12

标签: asp.net-mvc asp.net-mvc-3

如果问题不明确。我在一个解决方案中有3个MVC项目。每次我创建一个新项目时,它都会添加“Scripts”文件夹,其中包含我需要的所有.js文件。我不想每次都为每个应用程序创建这个。有没有办法从解决方案的中央文件夹中引用脚本,这样所有应用程序/项目都可以共享一个公共脚本文件夹,其中包含它们之间共有的所有脚本?

修改 如果有任何问题,请解释这样做的利弊......现在我很好奇。

7 个答案:

答案 0 :(得分:109)

以下是我的建议:

右键单击解决方案并创建一个名为Common Javascript Files新解决方案文件夹(或者您想要调用它的任何内容。

New Solution Folder

Common Javascript Files Solution Folder

右键单击解决方案,在Windows资源管理器中单击打开文件夹, 或者手动浏览其他版本的Visual Studio :(

Open Folder In Windows Explorer

在解决方案目录中,创建一个与解决方案文件夹同名的目录(解决方案文件夹通常不匹配源代码级别的目录,但这样做是出于理智的考虑)。

Common Javascript Files Directory

在此新目录中,添加需要在解决方案之间共享的文件。

Add Javascript Files To Directory

在Visual Studio中,单击解决方案文件夹,然后选择添加 - 现有项

Visual Studio Add - Existing Itme

在文件选择对话框中,导航到上一个创建的目录,选择添加到目录中的文件,然后单击添加

Select Files To Add

Solution Folder Files

在需要共享文件的每个项目中,右键单击项目(或项目中的目录),然后单击添加 - 现有项

Project Add Existing Item

导航至共享目录,选择文件并单击下拉箭头,然后单击添加为链接

Add As Link

现在,项目中的文件基本上是对解决方案文件夹中文件的快捷方式。但它们被视为项目中的实际文件(包括.CS或Visual Basic文件,它们将被编译为实际存在于项目中的文件)。

Linked Files

<强>赞成

  • 文件在设计时
  • 的项目中真正共享
  • 只能添加每个项目所需的文件,而不是全部或全部
  • 在IIS(虚拟目录等)中不需要任何配置
  • 如果解决方案在TFS源代码管理中,您可以将目录添加到TFS源,共享文件将受源代码控制。
  • 通过在项目中选择文件来编辑文件,将编辑实际文件。
  • 删除链接文件不会删除该文件。
  • 这不仅限于JS文件,链接文件可以是您可能需要的 ANY 文件(图像,Css,Xml,CS,CSHTML等)

<强> CONS

  • 每个部署都有自己的文件。
  • 了解解决方案文件夹不是解决方案目录中存在的目录时,学习曲线很小。

答案 1 :(得分:21)

最好的办法,imo,就是推出自己的CDN ......基本上只是在IIS中创建另一个网站,并给它自己的绑定,例如“http://cdn.somedomain.com

然后将所有css / js / fonts / shared images等存储在CDN网站上,并从其他网站链接到它们。

这样做可以解决2个问题,

  1. 您需要共享所有内容,并且每个文件只需管理1个版本。
  2. 您的用户浏览器可以将它们缓存在一个位置,而不是为每个使用它们的网站下载您的资料的副本。
  3. 我添加了这个答案,因为我看到很多人推荐创建虚拟目录。虽然这确实共享文件,但它为它们创建了多个下载路径,这极大地浪费了带宽。为什么让你的用户下载jquery.js(1 *个站点数),你可以允许他们下载一次(cdn.somedomain.com)。

    另外,当我说浪费带宽时,我不只是谈论服务器带宽,我在谈论数据计划的移动用户......例如,我在我的公司HR网站(保险等)上前几天打电话,大门消耗了250mb,每次下载jquery和一堆东西5次......每月一个2GB的数据计划,这样做的网站真让我烦恼。

答案 2 :(得分:11)

在这里,IMO是最好和最简单的解决方案,我花了一个星期试图找到最好和最简单的方法,总是比专业人士更有利于:

Resources(DLL)
  Shared
    images
      image.png
    css
      shared.css
    scripts
      jquery.js


MvcApp1
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

MvcApp2
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

将以下内容添加到MvcApp1 - &gt;项目 - &gt; MvcApp1属性 - &gt;建立活动 - &gt;发布后事件:

start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y

以下是对其作用的解释:Including Build action content files directory from referenced assembly at same level as bin directory

对MvcApp2执行相同操作。现在每次构建完成后,新的静态文件将被复制到您的应用程序中,您可以访问“〜/ Shared / css / site.css”等文件

如果你想要,你可以调整上面的命令,将脚本从.dll复制到每个应用程序的脚本文件夹,这样你就可以将一些脚本移动到.dll而不必改变任何路径,例如:

如果您希望在每次构建后仅将资源/共享/脚本中的脚本复制到MvcApp1 /脚本中:

start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y

答案 3 :(得分:4)

这是一个迟到的答案,但微软已经添加了一个名为Shared Project的项目类型,从Visual Studio 2013 Update 2开始,可以完全按照您的要求而不必使用link个文件。

  

共享项目引用显示在“引用”节点下   解决方案资源管理器,但共享项目中的代码和资产是   将它们视为链接到主项目的文件。

“在以前版本的Visual Studio中,您可以通过添加 - >现有项目然后选择链接来共享项目之间的源代码。但这有点笨重,每个单独的源文件都必须单独选择随着支持多个不同平台(iOS,Android等),他们决定通过添加共享项目的概念,更容易在项目之间共享源代码。“

https://blogs.msdn.microsoft.com/somasegar/2014/04/02/visual-studio-2013-update-2-rc-windows-phone-8-1-tools-shared-projects-and-universal-windows-apps/

此主题的信息:

What is the difference between a Shared Project and a Class Library in Visual Studio 2015?

https://stackoverflow.com/a/30638495/3850405

答案 4 :(得分:2)

在IIS中,为3个应用程序中的每个应用程序创建一个指向相同脚本文件夹的虚拟文件夹。然后,您只需将它们保存在单个应用程序中。还有其他选择,但它实际上取决于您的应用程序的结构。

修改

更可怕的想法是使用区域。在公共区域中有一个脚本目录,脚本设置为要编译。然后通过将它们从dll中取出来为自己服务。如果您预见到公共区域稍后会有更多功能,那么这可能是一个好主意。

答案 5 :(得分:2)

一个建议,允许您调试脚本而无需重新编译项目:

  • 选择一个“”项目(您将用于调试)并将物理文件添加到其中
  • 使用Eric的回答中所述的“添加为链接”功能,将脚本文件添加到解决方案中的其他项目
  • 在Build上使用CopyLinkedContentFiles任务,如Mac的评论中所建议的那样将文件复制到第二个文件到其他项目

通过这种方式,您可以修改“ master ”项目中的脚本,而无需重新启动调试器,这对我来说是个不同的世界。

答案 6 :(得分:1)

默认情况下包含的大多数文件也可以通过各种CDN获得。

如果您没有添加自己的自定义脚本,则可能甚至不需要脚本目录。

Microsoft的脚本CDN:http://www.asp.net/ajaxlibrary/cdn.ashx