当您从Visual Studio(2017(启动ASP.NET核心项目时,假设工作目录是源代码所在的位置,而不是实际放置构建文件的位置。
这意味着当我运行项目时,它会从C:PathToMyProjectappsettings.json
而不是C:PathToMyProjectbinDebugappsettings.json
读取配置文件。
我可以看到当我调试此代码时是这种情况:
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((context, config) => {
config.SetBasePath(context.HostingEnvironment.ContentRootPath);
config.AddJsonFile("appsettings.json", true, false);
});
ContentRootPath
指向项目文件夹,而不是放置构建文件的位置。
我可能可以通过在Project Properties > Debug
中设置Working Directory
来解决此问题,但是看到我们也使用配置变换(slowcheetah(,每个开发人员都将对调试输出(binDebug[CustomConfiguration]
(具有自己的构建配置,并为一个开发人员更改.csproj
为所有其他开发人员打破它。
是否有任何方法可以使ASP.NET Core读取从构建文件而不是项目文件夹的位置读取配置文件,而无需更改Working Directory
,但仍在用于多个"构建配置"?
如果我正确理解问题,则每个开发人员相对于其用户名都有不同的输出文件夹。因此,如果您构成这样的东西,
var debug = string.Empty;
#if DEBUG
debug = "Debug";
#else
debug = "Release";
#endif
var userNameVariable = System.Environment.GetEnvironmentVariable("USER");
debug += $"[{userNameVariable}]";
var path = System.IO.Path.Combine(env.ContentRootPath, "bin", debug);
var builder = new ConfigurationBuilder()
.SetBasePath(path) //env.ContentRootPath
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
我已经在Mac OS上进行了测试,结果为
/Users/johndoe/Documents/Temp/contentasp/bin/Debug[johndoe]
其他解决方案。
在Visual Studio中,您有前构建和后构建脚本。在Visual Studio中,您可以获取输出文件夹,并将路径设置为前构建脚本上的环境变量。例如:
powershell.exe -ExecutionPolicy Bypass -File "$(ProjectDir)outputscript.ps1" -OutputFolder $(OutputPath)
和powershell脚本(outputscript.ps1
(
Param(
[Parameter(Mandatory = $true, Position = 1)]
[string]$OutputFolder
)
$env:OutputFolder = $OutputFolder
,您可以使用
在启动上获得价值var outputFolder = System.Environment.GetEnvironmentVariable("OutputFolder");
var builder = new ConfigurationBuilder()
.SetBasePath(outputFolder) //env.ContentRootPath
也许这将有助于将目录设置为应用程序工作目录:
Directory.SetCurrentDirectory(context.HostingEnvironment.ContentRootPath);
配置文件是从您通过SetBasePath
配置的位置读取的。开发模式中发生的事情是,当您使用WebHost.CreateDefaultBuilder
时,它将BasePath
设置为源代码文件夹,这对于大多数开发人员案例都是合乎逻辑的。
它实际上无法开箱即用的控制台应用程序,例如,我在那里专门这样做。
可能有几种方法可以解决此问题:
-
使用现有系统,因为它默认情况下非常方便。也许您可以在更多详细信息中解释为什么它不适合您?
-
不使用
CreateDefaultBuilder
并自己创建构建器,然后您将能够按照需要进行配置。 -
覆盖
SetBasePath
,其值之后想要的值。我认为例如AppContext.BaseDirectory
或Directory.GetCurrentDirectory()
将返回您要寻找的路径 -
不为您的环境使用名称"开发"也可能会解决问题,尽管您还需要考虑其他一些后果。
P.S。当您可以使用敏捷配置时,为什么您要完全使用Slowcheetah进行旧样式的转换?您可以从多个文件中读取配置,最后一个文件始终赢得访问,因此它与在实践中使用slowcheetah的效果相同。