.NET(Visual Studio)在项目之间共享资源

14

我正在使用Visual Studio。我有一个解决方案,其中包含几个Web项目(.net MVC 4)。所有这些Web项目都使用相同的JavaScript库。目前,我将库复制到每个项目中,但这不可能是最终解决方案。在所有项目之间共享这些库(资产)的最佳方法是什么?只需链接它们吗?或者是否可以创建一个项目并在所有项目中引用它?

更新

从另一个项目“链接”JavaScript文件不是可行的解决方案,因为我必须链接数千个文件(我正在使用的一个库是ExtJs),这使得无法构建项目...

可能的解决方案

目前我有一个名为“Web”的(Web)MVC项目和一个名为“ClientScript”的(类库)项目,其中包含在多个Web项目之间共享的所有JavaScript文件。由于链接所有所需的JavaScript文件不是可行的解决方案(因为这涉及成千上万的文件,会导致Visual Studio冻结),我使用每个Web项目中的Build Events(Project -> Properties -> Build Events -> Post-build)将所有所需的JavaScript文件复制到各个项目中。我的Web项目中的Post-build命令行如下:

start xcopy "$(SolutionDir)ClientScript\Frontend\*" "$(SolutionDir)Web\Scripts" /r /s /i /y /D /E

每次构建您的Web项目时,所有更改过的JavaScript文件都会从ClientScript项目复制到您的Web项目中。

在开发JavaScript时,我运行一个小型“文件监视器”工具,当文件更改时自动将其从ClientScript项目复制到每个Web项目中。这样,当我对其中一个Javascript进行更改时,就不必每次都构建Web项目。


嗨!我正在尝试实现与您相同的结果。但是,您是如何在“Web”项目中引用JS文件的? - André Miranda
5个回答

3
未来任何偶然发现这个问题的人都应该知道Visual Studio现在有共享项目来解决这个问题。通用Windows项目默认使用它们,您可以通过下载和安装此处的VS扩展来创建自己的共享项目:https://visualstudiogallery.msdn.microsoft.com/315c13a7-2787-4f57-bdf7-adae6ed54450 注意:目前他们可能会对您尝试添加共享引用的项目类型挑剔。我创建了一个JavaScript共享项目,用于在Windows Store js应用程序和MVC Web应用程序之间共享js文件,但它不会让我这样做,因为它们必须是相同的语言。(它支持C#、C++或JavaScript)。

看起来这个特定的链接只适用于 VS 2013。我相信 VS 20152017 已经支持这种类型的项目。然而,我无法从我的 Web 项目中引用它们。我仍在努力弄清楚这一点。 - Reuel Ribeiro

2
将JS文件放在单个文件夹中,通常是所有其他文件夹的上层,并将它们添加到项目中,但使用“链接”选项。这是“添加现有项目...”对话框中“确定”按钮下拉菜单的一部分。

嗨,Michael。感谢你的意见。我知道“链接”选项,但只是从与另一个项目无关的项目“链接”文件,这样做有点不太规范吧?创建一个独立的项目来保存共享资源会更清晰一些吗? - sjkm
1
@sjkm,在你的问题中,你已经定义它们是相关的。实际上它们是同一个库。采用替代方案制作 NuGet 包并不太合理。请注意这一点。 - Mike Perrenoud
@sjkm,我并没有建议你将它们放在主文件夹中;我建议你只需将它们放在一个高于所有其他文件夹的文件夹中,并链接到它们。当你更改其中一个时,无论你在哪个项目中,它们都会同时更改。 - Mike Perrenoud
啊,我的错,谢谢。我认为为此创建一个新项目是好的,因为所有东西都放在一个解决方案中(更好的概述)...? - sjkm
@sjkm,你无法从另一个项目中“include”(包含)JavaScript文件。JavaScript文件需要存在于网络项目中。从这个角度来看,你唯一的方法就是在每个网络项目上构建一个后构建脚本,以将构件复制到它们各自的目录中。我不认为这是一个可行的解决方案,但这取决于你。 - Mike Perrenoud
显示剩余8条评论

1
稍微有点旧的帖子,但我有另一种使用Web Essentials完成类似操作的方法,可以解决无法正确发布的问题。
我有一个共享文件夹,位于需要共享文件的项目之外,通常是一个包含其他内容的“common”项目,但也可以像Michael Perrenoud建议的那样只是一个简单的文件夹。
但是,我不是使用“添加为链接”,而是在需要共享js/css文件的项目中创建一个新的bundle,名称与共享文件相同,然后使用相对引用位置引用共享文件夹中的文件,而不是以根为基础的引用位置。
要将位于解决方案根目录中的共享文件夹中的文件添加到脚本文件夹中,请在新的bundle文件(*.bundle)中使用以下代码,根据需要更改文件夹/文件名称。
<?xml version="1.0" encoding="utf-8"?>
<bundle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://vswebessentials.com/schemas/v1/bundle.xsd">
        <settings>
                <minify>false</minify>
                <runOnBuild>true</runOnBuild>
        </settings>
        <files>
                <file>../../MySharedFolder/my-js-file.js</file>
        </files>
</bundle>

每次构建时,它会重新创建最新版本的包,并按预期发布该版本 :) 如果需要,甚至可以通过将 'minify' 改为 true 来创建缩小版。或者更好的方法是,如果您希望,还可以将它们作为一束添加,您拥有这种灵活性。

1
每次运行新的ASP.NET MVC 4项目时,它都会占用一个新端口,不同的应用程序使用的端口也不同。
我建议您简单地执行以下操作:
运行包含所有软件包的项目。在WebMatrix中打开它们并以localhost:80运行。
您需要在WebMatrix中的设置部分设置站点的端口。现在,它将在localhost上可达,您可以从这些软件包引用所有库。

0

这是一个较旧的帖子,但由于复杂的业务需求,现在的应用程序被分成不同的模块或子项目。因此,我们需要共享常见的资源,如JavaScript文件、主题和CSS样式表文件。

我个人认为,应该将公共文件放在单独的Asp .Net MVC 5项目中,该项目具有以下结构:ASP.NET MVC5文件夹结构

enter image description here

现在最好的部分是您可以使用Bower、NPM或Nuget软件包管理器单独管理依赖项。

在组织好此项目中的所有文件后,将此项目托管到您自己的CDN上或者可能放在云上。您可以使用使用打包方式的CDN来获取脚本或链接引用。

这将帮助您在所有项目中共享公共资源。不过,如果团队中有许多开发人员并且某人添加了不兼容版本的库,则可能会影响所有应用程序。


为了读者的利益,我只是在答案中粘贴了裁剪过的屏幕截图。 - superjos
你的回答非常令人困惑,与默认模板有何不同?默认模板只是一个没有共享内容的新项目,而你所描述/发布的又有何不同?我读了这个,却一无所获,就像你在说使用默认设置,而不必费心展示如何共享内容。我错过了什么吗? - Seabizkit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接