从Visual Studio开始 ASP.NET Core不会从构建文件夹开始



当您从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设置为源代码文件夹,这对于大多数开发人员案例都是合乎逻辑的。

它实际上无法开箱即用的控制台应用程序,例如,我在那里专门这样做。

可能有几种方法可以解决此问题:

  1. 使用现有系统,因为它默认情况下非常方便。也许您可以在更多详细信息中解释为什么它不适合您?

  2. 不使用 CreateDefaultBuilder并自己创建构建器,然后您将能够按照需要进行配置。

  3. 覆盖SetBasePath,其值之后想要的值。我认为例如AppContext.BaseDirectoryDirectory.GetCurrentDirectory()将返回您要寻找的路径

  4. 不为您的环境使用名称"开发"也可能会解决问题,尽管您还需要考虑其他一些后果。

P.S。当您可以使用敏捷配置时,为什么您要完全使用Slowcheetah进行旧样式的转换?您可以从多个文件中读取配置,最后一个文件始终赢得访问,因此它与在实践中使用slowcheetah的效果相同。

相关内容

  • 没有找到相关文章

最新更新