📜  msbuild 包含目录中的文件 (1)

📅  最后修改于: 2023-12-03 15:03:03.591000             🧑  作者: Mango

MSBuild 包含目录中的文件

在使用 MSBuild 进行项目构建时,我们通常需要引用一些在项目文件夹外部的文件,例如项目依赖的库、配置文件等。这时,我们可以通过 MSBuild 的包含目录(<ItemGroup> 中的 <None Include="..." />)来告诉 MSBuild 需要引用哪些文件。

包含目录的语法

包含目录的语法非常简单,只需要在 <ItemGroup> 中添加 <None Include="..." /> 节点,并将 Include 属性设置为需要引用的文件的路径即可。例如:

<ItemGroup>
  <None Include="..\libs\library.dll" />
  <None Include="..\config\appsettings.json" />
</ItemGroup>

在这个例子中,我们将 library.dllappsettings.json 两个文件包含到了项目中,它们的文件路径分别为 ..\libs\library.dll..\config\appsettings.json,即相对于项目文件夹的上级目录下的 libsconfig 文件夹。

需要注意的是,这里使用了 <None> 节点来表示文件,因为这些文件实际上并不是编译到项目中的源代码,而是需要打包到生成的程序集中的依赖项和资源文件。如果需要将这些文件作为嵌入式资源打包到程序集中,则可以将其包装在 <EmbeddedResource> 中。

使用包含目录

当我们需要使用包含目录中的文件时,可以通过 $([PROJECT_ROOT]) 属性来引用。例如,如果我们要在代码中读取 appsettings.json 文件中的配置项,可以这样编写代码:

using System.IO;
using Microsoft.Extensions.Configuration;

...

var configBuilder = new ConfigurationBuilder()
    .SetBasePath(Path.Combine(
        Path.GetDirectoryName(typeof(Program).Assembly.Location),
        $@"..\..\..\..\src",
        $@"..\config"))
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

var config = configBuilder.Build();

var value = config.GetValue<string>("my_config_key");

在这个例子中,我们通过 Path.Combine 函数将 $([PROJECT_ROOT]) 属性和配置文件相对路径联合起来,得到了完整的文件路径。然后,通过 ConfigurationBuilder 加载 appsettings.json 文件并获取其中的配置项。

总结

通过包含目录,我们可以轻松地将项目外部的依赖项和资源文件引入到 MSBuild 中,进而打包到程序集中,帮助我们更好地管理项目的依赖项和资源。同时,我们还需要合理地运用包含目录,避免引入无用的文件,提高项目构建的效率。