在Visual Studio 2010中处理常见的JavaScript文件



我们开始开发几个完全依赖JavaScript的web应用程序(我们以前的应用程序是ASP.NET MVC,上面点缀着JavaScript的"good")。

我们有一些文件将被全面共享,最好将这些文件存储在一个Common项目中,并将它们"添加为链接"到各个项目中(编译后的代码也可以)。

显然,这不适用于JavaScript之类的东西,因为文件实际上并不在正确的位置。

有人建议保留一个共享JavaScript文件的单一版本,以便在多个项目中使用吗

我知道这个问题很古老,但我仍然想提出我的解决方案,因为它比beardtwizzle的简单一点。

您可以通过在.csproj文件的末尾添加以下内容来确保Visual Studio将所有链接的文件复制到您在Visual Studio的解决方案资源管理器中放置链接的位置:

  <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

最终,我就是这样做到的。这可能不符合每个人的口味,但对我来说是一种享受。

注意:在我们所有的项目中,静态资源都在一个名为"Assets"的根目录中,因此例如JavaScript总是在/Assets/js/和CSS/Assets/CSS/中。

解决方案

  1. 在要"导入"公共代码的项目中,我只需在/Assets/js/中添加公共.js文件"As Link"
  2. 转到新添加的属性,并将"复制到输出目录"设置为"如果更新则复制"
  3. 现在,我只需将项目的构建后事件命令行编辑为以下内容:xcopy/Y/E"$(TargetDir)\Assets"$(ProjectDir)\Assets"

当项目生成时,它会将导入的文件复制到\bin\Assets\js中——生成后事件会将这些文件的副本转移到项目目录中——以便网站及时使用。

正确的解决方案是在项目中嵌入javascript/css文件。您可以使用WebResources.axd来实现这一点。这是微软在其控件中嵌入js的官方方式。(类似验证控制)

你可以找到一个很好的教程:https://web.archive.org/web/20211020131200/https://www.4guysfromrolla.com/articles/080906-1.aspx

我也可以看出这个问题很古老,但我想我会加上我的两分钱。。。

我在一个单独的项目中有一个javascript文件。我添加了一个链接引用,这对发布很有效,但在IIS Express或Casinni中不起作用。我尝试添加自定义路由来捕捉丢失的文件并手动重新映射它,但这有点像黑客,当我升级到MVC 5.1时,由于某种原因停止了工作,所以我找到了一个更好的方法:

System.Web.Optimization具有javascript捆绑包。

在共享项目中,在js文件上将Copy To Output Directory设置为"始终复制",将Build Action设置为"内容"。这意味着你的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>

您将需要microsoft.aspx网站的nuget软件包。优化

将来在这里遇到这个问题的任何人都应该知道,Visual Studio中现在有共享项目可以解决这个问题。通用Windows项目默认使用它们,您可以在此处下载并安装VS扩展来创建自己的项目:https://visualstudiogallery.msdn.microsoft.com/315c13a7-2787-4f57-bdf7-adae6ed54450

下载扩展后,可以将共享项目(空)添加到解决方案中。该项目可以在Visual C#、Visual C++和JavaScript的项目模板中找到。

然后将要共享到共享项目的文件包含在任何对您有意义的文件夹结构中。

接下来,您将把共享项目作为共享引用包含在该解决方案中需要访问共享文件的其他项目中。右键单击其他项目,然后选择"添加共享项目引用"。

现在,您可以引用主项目中的共享文件,就好像共享项目中的文件存在一样。它们是作为该项目的一部分进行编译的。

该技术旨在让通用应用程序在Windows Phone和Windows应用商店应用程序之间共享代码,因此请注意,在不同的情况下,您可能难以共享代码,但值得一试,看看它是否能满足您的需求。

您也许可以使用visual studio模板

这个问题很好,我已经考虑了很长一段时间了。我脑海中浮现的唯一解决方案是在网络上托管文件,并像cdn或使用符号链接一样使用它们。您可以在visual studio中添加一个代码片段来引用它们。

这篇博客文章描述了@beardtwizzle的答案的替代解决方案:

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

想法类似:

  1. 将共享文件作为链接添加到web项目
  2. 修改项目中的_CopyWebApplication生成步骤,以便将链接的文件复制到正确的目标路径

因此,文件不是由生成后事件复制的,而是由修改后的生成步骤复制的。对我来说,这种解决方案感觉有点干净(但这很可能是口味的问题)。不管怎样,我只是把它添加到我们的解决方案中,到目前为止效果很好!

使用正确的版本控制。

将js放在一个位置,然后只要更新了javascript,就只需git pull(或等效的Mercurial/Bazaar)将它们放回代码中。

最新更新