假设我有一些项目,一个库Foo
和两个项目Bar
和Baz
,它们依赖于Foo
。Foo
包含一些将在Bar
和Baz
之间共享的配置,但是Bar
和Baz
也将执行一些在它们之间不同的配置。
在Foo
中,我有一个配置文件:
/* /dev/Foo/fooConfig.json */
{
"lorem": "ipsum",
"dolor": "set"
}
以及执行初始配置的方法:
/* /dev/Foo/configuration.cs */
public static IConfigurationBuilder BuildBaseConfiguration()
{
return new ConfigurationBuilder()
.AddJsonFile("fooConfig.json")
}
在Bar
中,我有类似的代码:
一个二个一个一个
通常,Foo
作为NuGet包分发,但在开发过程中,我通过包含以下Bar.csproj
在本地引用它:
<Reference Include="Foo">
<HintPath>../Foo/bin/Debug/net6.0/Foo.dll</HintPath>
</Reference>
我已经确保fooConfig.json
被复制到输出目录,并且在成功运行构建后它确实出现了。
但是,在运行Bar
之后,我得到了以下错误:
System.IO.FileNotFoundException:未找到配置文件"fooConfig.json",该文件不是可选的。预期的物理路径为"/dev/Bar/bin/Debug/net6.0/fooConfig.json "。
看起来. NET核心正在使用基于运行时工作目录的相对文件路径(/dev/Bar/bin/Debug/net6.0
)而不是文件实际保存的位置(../Foo/bin/Debug/net6.0/fooConfig.json
)来查找配置文件。
如何纠正这种行为,以便. NET核心引用fooConfig.json
的真实位置?
1条答案
按热度按时间zbq4xfa01#
默认情况下,
ConfigurationBuilder
使用AppContext.BaseDirectory
(参见源代码)作为文件搜索的根目录。您可以尝试如下操作来覆盖此行为:附言
就我个人而言,我认为库不应该附带它的配置文件,我会以这样的方式重构代码,它公开了设置类型(带有一些默认值),并由消费项目来处理这些。