8

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

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

这是我的捆绑包的示例:

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

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

可以捆绑链接的文件吗?

4

2 回答 2

8

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

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


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

在调试模式下,捆绑被禁用,脚本单独链接。由于文件不会复制到 Web 应用程序的根目录,因此用户将无法通过 IIS 访问它们。如果您尝试在每次构建应用程序时启用脚本文件的复制,文件将被复制到binWeb 应用程序的目录。该目录无法通过 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" />
于 2013-07-23T16:21:32.537 回答
6

我发现捆绑链接文件最简单的解决方案是添加一个 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 文件等,而无需将它们提交到源代码控制或破坏捆绑。

于 2016-08-29T13:14:24.413 回答