捆绑链接的JavaScript文件

时间:2013-07-23 15:47:18

标签: c# asp.net-mvc asp.net-mvc-4

我正在使用Visual Studio 2012和MVC4。我已经将链接文件(来自另一个项目)添加到我的MVC4应用程序中。以下是文件的属性:

  • 构建操作:内容
  • 复制到输出目录:不要复制

以下是我的捆绑示例:

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/jquery.unobtrusive*","~/Scripts/jquery.validate*","~/Scripts/FolderA/*.js"));

为了测试,我还在该文件夹中添加了一个空的JavaScript文件(temp.js)。这不是链接文件。检查页面源时,将显示此文件,但链接文件不会出现。我无法直接导航到此文件。捆绑中的其他文件看起来很好。

可以捆绑链接文件吗?

2 个答案:

答案 0 :(得分:8)

简答:在调试模式下为否,在发布模式下为是。

文件链接是一种Visual Studio概念,用于将存储在别处的文件包含在代码和资源编译中。显然,如果您需要编译它(它是源文件),如果您需要将其作为资源嵌入或者需要将其复制到目标目录(如果将复制到输出目录设置为复制),则链接文件将起作用。 / p>


为什么它在调试模式下不起作用

在调试模式下,禁用捆绑并单独链接脚本。由于文件未复制到Web应用程序的根目录,因此用户无法通过IIS访问它们。如果每次构建应用程序时都尝试启用脚本文件的复制,则文件将被复制到Web应用程序的bin目录中。无法通过IIS访问此目录,这也不起作用。


为什么它在发布模式下有效

在发布模式下,执行脚本捆绑。脚本文件未单独链接到网页,因此用户无需直接访问它们。只有捆绑代码才能访问它。但是你必须偷偷摸摸地配置它。你需要:

  • Copy to Output Directory链接脚本设置为Copy always。如果将链接的脚本存储在〜/ Scripts中,编译应用程序后,它们将被复制到〜/ bin / Scripts文件夹。
  • 配置捆绑路径以包含bin目录。

请注意以下行中的~/bin/Scripts/

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/jquery.unobtrusive*","~/Scripts/jquery.validate*","~/bin/Scripts/FolderA/*.js"));

禁用调试模式

这里提到的调试模式不是Visual Studio中的编译器设置。这是web.config文件中的元素。

<system.web>
    <compilation debug="false" targetFramework="4.5" />

答案 1 :(得分:5)

我发现捆绑使用链接文件的最简单的解决方案是添加一个MSBuild目标,该目标会在每次构建之前自动将任何链接的内容文件复制到正确的位置。

只需将以下内容添加到[project].csproj文件中:

<!-- Copy linked content files to their location on build. -->
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
  <Copy SourceFiles="%(Content.Identity)" DestinationFiles="%(Content.Link)" SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" Condition="'%(Content.Link)' != ''" />
</Target>

这允许我从他们的NuGet包链接Angular JavaScript文件,Bootstrap CSS文件等,而不必将它们提交到源代码控制或打破捆绑。