如何确保 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 - 除了元素名称我学到了其他一些很酷的方法来做到这一点!
您可以从另一个项目中获取设置文件。
.SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("appsettings.json")
.Build();
或者,这更酷。您可以指定不同的项目并从那里加载设置文件。这样您就不需要在不同的项目中重复副本或配置文件了。
.UseStartup<API.Startup>()
.ConfigureAppConfiguration(config => config.AddJsonFile("appsettings.json"));
另请参阅我关于确保复制文件的其他答案。
【讨论】:
以上是关于如何确保 appsettings.dev.json 被复制到输出文件夹?的主要内容,如果未能解决你的问题,请参考以下文章