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


76

万一问题不清楚。我在一个解决方案中有3个MVC项目。每次我创建一个新项目时,它都会添加“ Scripts”文件夹以及所有我需要的.js文件。我不想每次都为每个应用程序创建它。有没有办法从解决方案的中央文件夹中引用脚本,以便所有应用程序/项目都可以与它们之间的所有通用脚本共享一个通用脚本文件夹?

编辑: 如果有的话,请说明这样做的利弊...现在我很好奇。


这不适用于文件夹,但是您可以链接另一个项目中的文件。右键单击一个文件夹并添加一个现有项,在另一个项目中找到您的文件,单击“添加”按钮旁边的箭头,然后选择“添加为链接”。在部署之前,该文件实际上不会存在于正确的位置,因此,在Visual Studio中进行调试时,此方法不适用于静态脚本文件。
尼克·范德派

Answers:


118

这是我的建议:

右键单击解决方案,然后创建一个新的解决方案文件夹,该文件夹称为Common Javascript Files(或任何您喜欢的名称。

新解决方案文件夹

通用Javascript文件解决方案文件夹

右键单击解决方案,在Windows资源管理器中单击“打开文件夹”,或在其中手动导航以查找其他版本的Visual Studio :(

在Windows资源管理器中打开文件夹

在解决方案目录中,创建一个与解决方案文件夹具有相同名称的目录(解决方案文件夹通常在源代码级别与目录不匹配,但是为了理智起见)。

通用Javascript文件目录

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

将Javascript文件添加到目录

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

Visual Studio添加-现有Itme

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

选择要添加的文件

解决方案文件夹文件

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

项目添加现有项目

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

添加为链接

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

链接文件

优点

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

缺点

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

38
还要注意,在调试过程中将无法访问链接文件,除非将任务添加到项目文件中以手动复制链接文件(如此处所述)
Mac

1
当我发布项目时,文件不会复制到我创建的文件夹结构中。任何想法如何解决这个问题?
Fonsini

2
@Fonsini正确设置链接文件的属性。
Erik Philips

1
我遇到的问题是尝试在HTML中包含JS文件时,它想解析到实际的文件夹-而不是链接的文件夹。那根本不可行。
MarzSocks 2015年

1
您可能想知道,此答案正在meta上(间接)进行讨论。
Ilmari Karonen

24

imo最好的办法是滚动自己的CDN ...基本上,只需在IIS中创建另一个站点并为其提供自己的绑定,例如“ http://cdn.somedomain.com”

然后将所有css / js / fonts /共享的图像等存储在CDN站点上,并从其他站点链接到它们。

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

  1. 您需要的所有东西都可以共享,并且每个文件只需管理1个修订。
  2. 您的用户浏览器可以将它们缓存在一个位置,而不必为使用它们的每个站点下载您的东西的副本。

我添加此答案是因为我看到很多人都在引用创建虚拟目录。尽管确实共享文件,但它会为它们创建多个下载路径,这是对带宽的极度浪费。当您允许用户在(cdn.somedomain.com)上一次下载jquery.js(网站数量为1 *)时,为什么要让他们下载。

另外,当我说浪费带宽时,我不仅在谈论服务器带宽,还在谈论数据计划中的移动用户...例如,我在手机上访问了我们公司的人力资源站点(保险等)一天,它一口气就消耗了25mb,每次下载jquery和一堆东西5次...在每月2GB的数据计划中,这样做的网站真的让我很烦。


以为我会添加该链接以链接到它们,如果同时配置了http / https,则使用//cdn.somedomain.com语法,它将默认使用任何includer。同样,如果您有一个dev CDN和一个Production CDN,则可以将CDN URL存储在appSettings中,例如ProdCdnUrl和DevCdnUrl,然后使用条件编译为项目的构建配置选择一个,例如#if DEV getdevurl #if PROD getprodurl。然后在剃刀模板中使用它,例如脚本src =“ @(cdnUrl)/ lib / bootstrap ...”
Ryan Mann

1
关于此问题的更多后续工作,实际上我完全放弃了通过此方法使用脚本和样式包。相反,我使用Node.js,Gulp,Css-Minify,Uglify,gulp-sass等。因此,我只执行“ Gulp compile-css”和“ gulp compile-js”以及“ gulp watch-css”和“ gulp watch-节点中的“ js”来处理将我的Sass和ES6 Javascript转换为CSS和ES5 Javascript。另外,我在.Net mvc Web应用程序的根目录中有一个节点project.json文件,并使用vs节点工具将交互式节点窗口与VS中的节点以及VS的此处命令行扩展一起使用。
Ryan Mann

感谢您在2016年2月的评论中提供的新见解。
Theophilus

我又变了。我现在将Gulp4与Babel和Rollup Js一起使用,并将汇总配置为编译为IIFE。我将资产编译为nuget包。在我们的CDN上,我们通过dotnet核心进行了基本的.Net Project设置,可以在其中添加软件包和更新软件包,并利用dotnet restore。因此,如果要向CDN中添加某些内容,请在nuget软件包中进行操作,并将其设置为可在构建时进行编译,“ dotnet pack”将使软件包脱离“ dst”文件夹,并在安装后添加dst文件夹到我们想要的目标项目。因此,我们可以使用dotnet cli控制CDN。
瑞安·曼

另外,如果我们更新软件包,我们可以只运行一个dotnet更新脚本并在发布管理/ devops自动化中进行设置。
瑞安·曼

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->项目-> MvcApp1属性->生成事件->生成后事件:

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

这是有关其作用的说明:在与bin目录相同级别的引用程序集中包括Build action content files目录

对MvcApp2执行相同的操作。现在,在每次构建后,都会将新鲜的静态文件复制到您的应用中,您可以访问“〜/ Shared / css / site.css”之类的文件

如果您希望调整上述命令以将脚本从.dll复制到每个应用程序的scripts文件夹,则可以将某些脚本移至.dll而无需更改任何路径,例如:

如果要在每次构建后仅将脚本从资源/共享/脚本复制到MvcApp1 /脚本中:

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

3个问题:1)如果从“资源/共享”中删除了一个文件,看起来好像不会从该文件夹的MvcApp副本中删除,会发生什么?2)有什么方法可以让Visual Studio$(SolutionDir)在运行完成后从其中删除这些文件。将它们留在那里可能会使其他开发人员感到困惑。3)您在资源文件夹后的括号中有(DLL)。有什么具体方法可以设置吗?
亚当

1)它们当然会保留在文件夹中,因为我们只复制它们。2)解决方案是在复制之前删除文件夹中的所有文件,您可以在xcopy之前添加如下内容:stackoverflow.com/questions/768282/…,或编写一个批处理脚本来检查文件中的两个文件夹并删除差异,然后使用以下命令进行调用:stackoverflow.com/questions/12764847/…3)仅供演示,其dll项目名为Resources
formatc

@亚当见上面的评论。
formatc

每当您编辑共享资源时,就需要构建项目以查看更改,对吗?
暗恋

@crush是的,但是您可以创建批处理脚本并将这些命令放入其中,然后替换post build event以启动脚本,并且可以手动启动它,也许VS中存在“宏”之类的东西可以让您运行脚本在文件更改。
formatc

6

这是一个迟到的答案,但微软已添加称为项目类型Shared Project出发Visual Studio 2013 Update 2,可以做你wan't什么,而不必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应用/

来自此线程的信息:

Visual Studio 2015中的共享项目和类库有什么区别?

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


在纸面上听起来很不错,但是我还没有看到在共享项目中成功使用JavaScript文件的任何示例。您可以确定创建共享项目,然后将脚本放在此处,但是Web项目似乎无法正确识别它们。
Nathanael

3

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

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

这样,您可以在“ master ”项目中修改脚本,而无需重新启动调试器,这对我来说是与众不同的。


您能否说明在不重新启动调试器的情况下如何在应用程序运行时修改“主”项目文件并使更改可用?链接的文件仅在构建时复制,并且您必须先停止调试器才能构建链接。
pbalaga '16

如果将物理文件添加到“母版”(而不仅仅是链接),则无需重新启动即可修改母版。在其他项目中,链接的文件将在构建时复制,但这影响较小,因为我大部分时间都在运行master。
DivineOps's

这应该被标记为答案,因为麻烦少了!对.csproj的修改如下:<!-将链接的内容文件复制到其在构建中的位置。-> <目标名称=“ CopyLinkedContentFiles” BeforeTargets =“ Build”> <复制SourceFiles =“%(Content.Identity)” DestinationFiles =“%(Content.Link)” SkipUnchangedFiles =“ true” OverwriteReadOnlyFiles =“ true” Condition = “'%(Content.Link)'!=”“ /> </ Target>
barbara.post

2

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

编辑

一个更可怕的想法是使用Areas。在公共区域中有一个脚本目录,其中包含要编译的脚本。然后通过让他们脱离dll来为自己服务。如果您以后预见公共区域具有更多功能,那么这可能是个好主意。


当项目在服务器上时,这是一个好主意。当项目仍在Visual Studio的开发框中时该怎么办?
尼克·范德派

@NickVanderPyle同样的想法会起作用。无论您使用的是回环适配器,其他站点还是仅不同的应用程序,都应该能够进行设置。
Yuriy Faktorovich 2011年

哦,我懂了。如果您在本地使用IIS运行和调试,并且可以使用虚拟文件夹,那么它将起作用。好决定。
尼克·范德派

如果IIS不可用,您如何看待NTFS交汇点?
尼克·范德派

@NickVanderPyle您必须从2个项目中删除脚本目录,但是是的,听起来也不错。
Yuriy Faktorovich 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.