一个物理文件可以直接作为资源内嵌到编译生成的程序集中。借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,不过在这之前我们必须知道如何将一个项目文件作为资源并嵌入到生成的程序集中。 [ 本文已经同步到《ASP.NET Core框架揭秘》之中]

目录
一、将项目文件变成内嵌资源
二、读取资源文件
三、EmbededFileProvider

在默认情况下,我们添加到一个.NET项目中的静态文件并不会成为项目编译生成的程序集的内嵌资源文件。如果需要,我们需要通过修改project.json文件中与编译相关的设置显式地将某个项目文件添加到内嵌资源文件列表中,这个与内嵌资源相关的配置选项就是“buildOptions/embed”。“buildOptions/embed”的配置结构比较典型,project.json文件中涉及到文件选择策略的绝大部分配置选项几乎都采用了这样的结构。除了用于选在内嵌资源文件的配置选项“buildOptions/embed”,其他与文件选择相关的配置选项还如下这些:

  • buildOptions/compile:从当前项目中选择参与编译的源文件。
  • buildOptions/copyToOutput:从当前项目中选择在编译时自动拷贝到输出目录(默认为bin目录)的文件。
  • packOptions/files:从当前项目中选择在打包的时候添加到生车的NuGet包的文件。
  • publishOptions:从当前项目中选择需要发布的文件。

对于包括“buildOptions/embed”在内的上述这五种配置选项,我们可以指定一个对象作为它的值。这个配置对象如下表所示的6个属性,我们可以利用“include”和“execlude”属性以Globbing Pattern表达式指定“包含”和“排除”的一组文件,也可以利用“includeFiles”和“execludeFiles”属性以文件路径(不含通配符)的形式将具体指定的文件“包含进来”或者“排除出去”。这些配置从本质上体现了针对一组项目文件的“转移”,在默认的情况源文件和目标文件具有完全一致的名称和相对路径,如果目标文件的路径或者名称不同,我们可以利用mapping属性对两者做一个映射。这些属性体现的路径都将项目所在的目录作为根路径。

属性

数据类型

描述

include

string/string[]

以Globbing Pattern表达式形式指定的需要被包含进来的文件。

execlude

string/string[]

以Globbing Pattern表达式形式指定的需要被排除出去的文件。它比include属性具有更高的优先级,所以如果include和exclude涉及到同一个文件,该文件会被排除出去。

includeFiles

string/string[]

以文件路径形式指定的需要被包含进来的文件。它比exclude属性具有更高的优先级,所以execlude将某个文件排除出去,我们可以利用includeFiles属性将它重新包含进来。

execludeFiles

string/string[]

以文件路径形式指定的需要被包含进来的文件。它的优先级比上述三个属性都高,所以include将某个文件包含进来后,我们可以利用excludeFiles属性将它重新排除出去。

buildIns

object

这个对象具有include和exclude两个属性,表示系统默认提供的文件。builtIns的include和execlude属性与上述的同名属性具有相同的定义方式和作用。如果我们对include和builtIns/include(或者execlude和builtIns/execlude)都做了配置,系统在计算最终选择的文件列表时会对它们进行合并。

mappings

map

转移过程源文件和目标文件在路径布局上的映射关系,其中Key代表目标文件的路径,至于Value,我们可以设置为源文件的路径,也可以设置为包含include, exclude,includeFiles and excludeFiles属性的对象。

接下来我们通过简单的实例来演示如何在project.json文件中对“buildOptions/embed”配置选项进行合理的设置从而将我们希望的文件内嵌到编译生成的程序集中。我们创建了一个空的.NET Core项目,并按照如下图所示的结构在根目录下创建了一个名为“root”的目录。总的来说该目录(含其子目录)一共包含4个文本文件,我们现在需要通过在project.json文件中设置它的“buildOptions/embed”配置选项,从而将相应的文本文件内嵌到项目编译生成的程序集中。

.NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统

假设我们我们对“buildOptions/embed”配置选项做了如下三种不同的设置。由于include|exclude与builtIns/include|builtIns/exclude具有相同的作用,所以前三种定义方式在文件选择的角度上讲是完全等效的,最终作为内嵌资源的文件只有两个,那就是“root/dir1/foobar/foo.txt” 和“root/dir1/baz.txt”。在默认的情况下,内嵌的资源文件是根据源文件在项目中的路径来命名的,具体的命名规则为“{程序集名称}.{文件路径}”(路径分隔符替换成“.”),所以这两个资源文件的名称为“App.root.dir1.foobar.foo.txt”与“App.root.dir1.baz.txt”。对于第三种定义方式,我们通过mappings属性做了一个简单的路径映射,进而将两个资源文件的名称改成“foo.txt”和“baz.txt”。

定义1

   1: {  
   2:   ...
: {
   4:     ...
: {
,
,
,
  10:     }
  11:   }
  12: }

相关文章:

  • 2021-06-21
  • 2022-02-12
  • 2021-11-21
  • 2022-12-23
  • 2021-10-03
  • 2022-12-23
  • 2022-02-28
  • 2021-05-22
猜你喜欢
  • 2022-12-23
  • 2021-06-09
  • 2022-12-23
  • 2021-04-24
  • 2021-11-28
相关资源
相似解决方案