C# 如何确保将appsettings.dev.json复制到输出文件夹?

C# 如何确保将appsettings.dev.json复制到输出文件夹?,c#,asp.net,configuration,asp.net-core,web-deployment,C#,Asp.net,Configuration,Asp.net Core,Web Deployment,我有三个配置文件,每个环境一个: appsettings.json->production appsettings.dev.json->development appsettings.stg.json->staging 如果我将ASPNETCORE_ENVIRONMENT设置为dev,就会出现运行时异常,抱怨无法找到appsettings.dev.json。我试着加上 "copyToOutput": [ "appsettings.dev.json" ] 指向project.json中的bu

我有三个配置文件,每个环境一个:

  • appsettings.json->production
  • appsettings.dev.json->development
  • appsettings.stg.json->staging
  • 如果我将ASPNETCORE_ENVIRONMENT设置为dev,就会出现运行时异常,抱怨无法找到appsettings.dev.json。我试着加上

    "copyToOutput": [
      "appsettings.dev.json"
    ]
    
    指向project.json中的
    buildOptions
    部分,但它似乎没有任何效果


    是否有其他方法可以强制将appsettings.dev.json复制到输出目录?

    是否设置了放置appsettings.dev.json的基本路径

    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
    
    在“project.json”中包含这一点对我很有用:

    ...
    "publishOptions": {
      "include": [
        "wwwroot",
         ...
        "appsettings.json",
        "appsettings.Development.json",
        ...
      ]
    },
    ...
    

    假设您正在使用Visual Studio:

    通常在过去,对于服务,我让其他开发人员设置“构建事件”,以确保项目中的某些内容得到构建。通常,它位于Visual Studio 2015的ASP.NET项目属性中,例如:>“生成事件”(左窗格)>单击“编辑生成后”。在命令行中编写项目应如何生成输出的说明。例如:

    mkdir "$(ProjectDir)bin\Setup"  
    
    在bin下创建一个名为“Setup”的目录

    Del "$(ProjectDir)bin\Setup\*.* /Q"
    
    删除新创建的箱子中的所有现有项目

    copy "$(TargetDir)*.dll"  "$(ProjectDir)bin\Setup"
    
    将dll从生成位置复制到新的安装位置

    现在,如果您正在执行一个构建过程,其中您的“配置管理器”正在为每个环境执行不同的输出,并且您只希望在任何时候都使用它们,那么您可能需要向上遍历一个级别,通过它们的名称“dev”或“stg”找到这些容器,然后将它们复制回来。您可以创建或列出VS知道的与JSON数据匹配的环境变量

    在我的例子中,没有为单元测试复制appsettings.json

    如果右键单击文件并选择属性,则会出现此对话框。将构建操作更改为嵌入式资源,文件将被复制到bin文件夹中,以便单元测试拾取


    在解决方案资源管理器中右键单击要复制到输出的文件(在您的情况下为
    appsettings.dev.json
    ),然后点击属性,在属性窗格中将复制到输出目录选项设置为始终复制。这样,每次生成项目时,您的文件都会复制到输出目录中(您的项目bin或发布目录取决于您的生成配置文件)

    如果您要将文件复制到输出文件夹中,您可以将其添加到csproj文件中:

    <ItemGroup>
       <None Update="appsettings.IntegrationTests.json">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </None>
    </ItemGroup>
    
    
    保存最新
    

    这与dotnet构建/测试/运行vscode和visualstudio配合使用

    我学会了一些其他很酷的方法

    您可以从另一个项目获取设置文件

    .SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
    .AddJsonFile("appsettings.json")
    .Build();
    
    或者,这更酷。您可以指定其他项目并从中加载设置文件。这样,在不同的项目中就不需要重复的副本或配置文件

    .UseStartup<API.Startup>()
    .ConfigureAppConfiguration(config => config.AddJsonFile("appsettings.json"));
    
    .UseStartup()
    .ConfigureAppConfiguration(config=>config.AddJsonFile(“appsettings.json”);
    

    另请参阅我关于确保文件被复制的另一个答案。

    您已经从Ivan那里得到了答案。也许指出这是否适用于您是一个好主意?我找不到一个解决方案来为每个环境部署特定的文件。您可以配置为部署所有project*.json文件-但这不是一个好选项,最理想的方案是每个环境1对1文件(配置名称)-悬赏是开放的:)请参阅,以获取特定于环境的appsettings的可能解决方案。这将防止引发异常,但是没有回答如何确保
    .dev.json
    文件被复制的问题。。。并检查您的.vscode/launch.json->“cwd”路径。将此从“${workspaceRoot}”设置为“${workspaceRoot}\src\myproject”对我有效。对我无效。它工作了一次,因为project.json发生了更改,并导致项目重新生成。唯一有效的解决方案-调用重建而不是生成。它同时适用于编译选项和发布选项。+1-最初与此相同,只是元素名为。其他一切都是一样的,但都不起作用。将其更改为“无”可以使其正常工作