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

Posted

技术标签:

【中文标题】如何确保 appsettings.dev.json 被复制到输出文件夹?【英文标题】:How can I ensure that appsettings.dev.json gets copied to the output folder? 【发布时间】:2016-11-05 19:25:42 【问题描述】:

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

    appsettings.json -> 生产 appsettings.dev.json -> 开发 appsettings.stg.json -> 暂存

如果我将 ASPNETCORE_ENVIRONMENT 设置为 dev,我会收到运行时异常,抱怨无法找到 appsettings.dev.json。我尝试添加

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

到 project.json 中的 buildOptions 部分,但它似乎没有任何效果。

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

【问题讨论】:

你已经从伊万那里得到了答案。也许最好指出这是否适合您? 我找不到为每个环境部署特定文件的解决方案。您可以配置以部署所有项目*.json 文件 -***.com/questions/37858312/… 但这不是一个好选择,完美的场景是每个环境(配置名称)一对一文件 - 赏金已打开 :) 请参阅this answer 了解特定环境应用设置的可能解决方案。 【参考方案1】:

你设置appsettings.dev.json的基本路径了吗?

var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true);

【讨论】:

这将防止异常被抛出,但没有回答如何确保.dev.json文件被复制的问题。 .. 并检查您的 .vscode/launch.json -> "cwd" 路径。将其从 "$workspaceRoot" 设置为 "$workspaceRoot\src\myproject" 对我有用。【参考方案2】:

在“project.json”中包含这个对我有用:

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

【讨论】:

对我不起作用。它工作了一次,因为 project.json 被更改并导致项目重建。只有解决方案有效——调用重建而不是构建。它适用于编译选项和发布选项。【参考方案3】:

假设您使用的是 Visual Studio:

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

mkdir "$(ProjectDir)bin\Setup"  

在 bin 下创建一个名为“Setup”的目录

Del "$(ProjectDir)bin\Setup\*.* /Q"

删除新创建的 bin 中的所有现有项目

copy "$(TargetDir)*.dll"  "$(ProjectDir)bin\Setup"

将 dll 从构建位置复制到新的设置位置

现在,如果您正在执行一个构建过程,其中您的“配置管理器”为每个环境执行不同的输出,并且您只希望它们中的每一个始终都需要遍历一个级别,请通过它们的'dev' 或 'stg' 的名称,然后将它们复制回来。您也许能够创建或列出 VS 知道的与您的 JSON 数据匹配的环境的变量。

【讨论】:

【参考方案4】:

在我的例子中,appsettings.json 没有被复制用于单元测试。

如果你右击文件并选择属性,就会出现这个对话框。将 Build Action 更改为 Embedded resource,该文件将被复制到 bin 文件夹以供单元测试拾取。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

这适用于 dotnet build/test/run vscode & visual studio

【讨论】:

+1 - 除了元素名称 之外,最初与此相同。其他一切都一样 - 但它不起作用。将其更改为 None 即可正常工作【参考方案7】:

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

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

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

或者,这更酷。您可以指定不同的项目并从那里加载设置文件。这样您就不需要在不同的项目中重复副本或配置文件了。

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

另请参阅我关于确保复制文件的其他答案。

【讨论】:

以上是关于如何确保 appsettings.dev.json 被复制到输出文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保OA系统的安全性?

如何确保 WSASend() 将发送数据?

如何确保消息正确地发送至RabbitMQ? 如何确保消息接收方消费了消息?

如何确保脚本由特定版本的 python 执行? [复制]

如何确保我取消订阅?

如何确保 didSelectRowAtIndexPath 打开正确的视图