【问题标题】:Handling common JavaScript files in Visual Studio 2010在 Visual Studio 2010 中处理常见的 JavaScript 文件
【发布时间】:2011-05-24 08:09:27
【问题描述】:

我们正在着手开发几个完全依赖于 JavaScript 的 Web 应用程序(我们之前的应用程序是 ASP.NET MVC,JavaScript 的“优点”洒在上面)。

我们有一些文件将被全面共享,最好将这些文件存储在一个通用项目中,并将它们“添加为链接”到单独的项目中(就像编译代码一样)。

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

是否有人对保留单个版本的共享 JavaScript 文件以供多个项目使用有任何建议?

【问题讨论】:

  • 好问题,我已经考虑这个问题很久了。我脑海中出现的唯一解决方案是将文件托管在网络上并像 CDN 一样使用它们或使用符号链接。您可以将代码 sn-p 添加到您的 Visual Studio 中以引用它们。

标签: javascript visual-studio-2010


【解决方案1】:

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

您可以确保 Visual Studio 将所有链接的文件复制到您在 Visual Studio 的解决方案资源管理器中放置链接的位置,方法是在 .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

【讨论】:

  • 谢谢!我比 xcopy PostBuildEvent 更喜欢这个,因为我的资产中有要复制的子目录,并且不希望所有项目中的所有共享资产。这会照顾他们所有人!
  • 我喜欢这个!不幸的是,一个小缺点是您需要在更新这些引用的 .js 文件的智能感知之前(重新)构建。但迄今为止最好的解决方案。
  • @Bigjim 尽管智能感知不起作用,但您是否必须构建才能获取共享文件的最新更改,或者我可以修改链接的 JavaScript 文件,并在调试时查看最新更改?
  • 在我看到这个之前,我为此工作了大约一个小时。然后我忽略了它可能过于侵入性,然后又工作了大约 5 个小时,直到我最终实现了它,这太容易了!像魅力一样工作。
  • 所以它将js文件物理复制到项目中?
【解决方案2】:

最后,这就是我实现它的方式。这可能不符合每个人的口味 - 但对我来说是一种享受。

注意:在我们所有的项目中,静态资源都位于名为“Assets”的根目录中,例如 JavaScript 始终位于 /Assets/js/ 和 CSS /Assets/css/ 中。

解决方案

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

当项目构建时,它会将导入的文件复制到 \bin\Assets\js - 然后构建后事件会将这些文件的副本复制到项目目录中 - 及时让站点使用它们。

【讨论】:

  • 您可以添加 /D 参数以仅复制更改的文件: xcopy /Y /E /D "$(TargetDir)\Assets" "$(ProjectDir)\Assets"
  • 从这个问题中最流行的答案中得到提示:stackoverflow.com/questions/3018289/… 我将命令行修改为以下内容:echo f | xcopy /Y /E "$(TargetDir)Content" "$(ProjectDir)Content",这防止了“exited with code X”错误发生在我的场景。
  • 通过启用“复制到输出目录”,bin 文件夹将被不属于它们的 .js 文件污染。我了解您在将它们复制到 \Assets 之前将其用作临时文件夹。它们将包含在部署中,但不会被使用。
【解决方案3】:

正确的解决方案是在您的项目中嵌入 javascript/css 文件。您可以使用WebResources.axd 来执行此操作。这是微软在其控件中嵌入 js 的官方方式。 (如验证控件)

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

【讨论】:

  • 虽然这是一个有趣的解决方案,但在脚本 src 属性中需要查询字符串并不好(这会导致某些代理缓存失败)。更重要的是,我无法将公共资源与本地项目文件合并为一个压缩的 JS 文件
  • 开发很少是千篇一律的,足以说出“正确的解决方案”
【解决方案4】:

我也可以看到这个问题很古老,但我想我会加两分钱......

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

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.aspnet.web.optimization 的 nuget 包

【讨论】:

  • 我喜欢这个想法,但是当捆绑关闭时它不起作用( 没有设置BundleTable.EnableOptimizations),因为它仍然尝试从bin目录提供它们.
【解决方案5】:

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

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

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

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

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

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

【讨论】:

  • 您能详细解释一下这项技术的工作原理吗?
【解决方案6】:

你也许可以使用visual studio templates

【讨论】:

  • 感谢您的建议,但我认为这只会在创建时采用“通用”代码。之后,需要在每个单独的项目中进行任何后续代码更改。
【解决方案7】:

很好的问题,我一直在考虑这个问题。我脑海中出现的唯一解决方案是将文件托管在网络上并像 CDN 一样使用它们或使用符号链接。您可以将代码 sn-p 添加到您的 Visual Studio 中以引用它们。

【讨论】:

    【解决方案8】:

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

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

    思路类似:

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

    因此,文件通过修改后的构建步骤复制,而不是构建后事件。对我来说,这个解决方案感觉有点干净(但这很可能是一个口味问题)。无论如何,我刚刚将它添加到我们的解决方案中,到目前为止效果很好!

    【讨论】:

      【解决方案9】:

      使用适当的版本控制。

      将 js 保存在一个位置,然后在您更新 javascript 时将 git pull(或等效的 Mercurial / Bazaar)返回到您的代码中。

      【讨论】:

      • 我们使用 TFS 2010,我似乎无法找到类似的功能来跨项目拉取单个文件
      • @beardtwizzle 我建议您将 js 保存在一个项目或 VC 位置,然后将其检出到您现有的代码中。或者作弊并将您的 js 托管在 git 服务器中;)
      • 我不确定这将如何解决这个问题?你会将它们配置为 git-submodules(类似于 svn:externals)吗?
      • @Cohen 我个人会为 javascript 使用包管理器。并将它们设置为模块/包。然后只需执行package_manager update 或其他任何操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多