捆绑链接的JavaScript文件

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

  • 构建行动:内容
  • 复制到输出目录:不要复制

这是我的包的一个例子:

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

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

链接文件可以捆绑吗?

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

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


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

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


为什么它在发布模式下工作

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

  • 将链接脚本的Copy to Output Directory设置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文件中的一个元素。

   

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

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

     

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