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

32

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

  1. appsettings.json -> production
  2. appsettings.dev.json -> development
  3. appsettings.stg.json -> staging

如果我将ASPNETCORE_ENVIRONMENT设置为dev,运行时会出现异常,提示找不到appsettings.dev.json。我尝试添加

"copyToOutput": [
  "appsettings.dev.json"
]

我在project.json文件的buildOptions部分添加了代码,但似乎没有任何效果。

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


1
你已经收到了Ivan的回复。也许最好指出这是否适用于你? - Maarten Bodewes
1
我找不到一个方案来针对每个环境部署一个特定的文件。 您可以配置发布所有的project*.json文件-https://dev59.com/RloU5IYBdhLWcg3wEz-N%c2%b4t-publish-correct-appsettings-env-environmentname-json 但这不是一个好的方案,最完美的情况是对于每个环境(配置名称)有一个1对1的文件——悬赏正在进行中 :) - J. Lennon
请参考此答案中针对环境特定appsettings的可能解决方案。 - Ben
7个回答

29

如果你想将一个文件复制到你的输出文件夹,你可以在你的csproj文件中添加以下代码:

<ItemGroup>
   <None Update="appsettings.IntegrationTests.json">
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
   </None>
</ItemGroup>

这适用于使用 dotnet 构建/测试/运行的 vscode 和 visual studio


1
+1 - 最初与此相同,只是元素名称<None />为<Content/>。其他所有内容都相同,但它不起作用。将其更改为None使其正常工作。 - Jacques
@Jacques 我也遇到了同样的问题。我想知道为什么会这样工作。 - ryanwebjackson
@Jacques 在尝试了一番后,似乎如果你使用“包含”而不是“更新”,<Content>也可以起作用。 - Yossi Sternlicht

21

在我的情况下,appsettings.json没有被复制到单元测试中。

如果你右键点击该文件并选择属性,将会弹出此对话框。将生成操作更改为嵌入的资源,该文件将被复制到bin文件夹中供单元测试使用。

输入图像描述


我怀疑“嵌入式资源”不是唯一可行的构建操作(阅读其他答案)。更多细节会很有用。 - ryanwebjackson

12
在解决方案资源管理器中右键单击您要复制到输出目录的文件(在本例中为appsettings.dev.json),然后点击属性。在属性窗格中,将复制到输出目录选项设置为始终复制。这样做可以使每次构建项目时,文件都会被复制到输出目录(根据构建配置文件而确定是项目二进制文件还是发布目录)。

9

将以下内容加入“project.json”,对我有效:

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

1
对我没用。它只有一次起作用,因为project.json被更改并导致项目重建。唯一有效的解决方案是调用rebuild而不是build。它适用于编译选项和发布选项。 - VorobeY1326

6
你是否设置了appsettings.dev.json所在的基础路径?
var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

3
这样做可以防止异常被抛出,但并没有回答如何确保.dev.json文件被复制的问题。 - Philip Pittle
请检查您的.vscode/launch.json -> "cwd"路径。将其从"${workspaceRoot}"设置为"${workspaceRoot}\src\myproject"对我有用。 - Vladislav

1

假设您正在使用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”找到这些bin文件夹,然后将它们复制回来。您也可以创建或列出一个VS知道与您的JSON数据匹配的环境变量。


-1

我学到了一些其他很酷的方法来做这件事!

你可以从另一个项目中获取设置文件。

.SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("appsettings.json")
.Build();

或者,更酷的是,您可以指定不同的项目并从那里加载设置文件。然后您就不需要在不同的项目中复制或配置文件了。

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

另外请查看我的关于确保文件已复制的其他答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接