当我在命令行中发出以下命令时:
dotnet publish -o "./../output" -c Release
dotnetcli
正确发布项目。但是,它不会复制appsettings.Production.json
文件,只会复制appsettings.json
。
这是为什么?我已经搜索过官方核心文档,但是还没有找到正确的环境appsettings.json
应该如何在发布输出中结束。
我应该手动将appsettings.Production.json
复制到已发布的文件夹吗?
答案 0 :(得分:74)
<强>更新强>
For current (new) .csproj format应使用CopyToPublishDirectory
属性。它确定是否将文件复制到发布目录,并且可以具有以下值之一:
然后将下一部分添加到.csproj
:
<ItemGroup>
<None Include="appsettings.Production.json" CopyToPublishDirectory="Always" />
</ItemGroup>
查看@nover answer和SO Exclude or include files on publish,了解有关发布期间文件控件的更多信息。
&#34;在project.json
文件中,您有publishOptions
部分include
,其中您已经有一些文件,例如&#34; appsettings.json&#34;:
"publishOptions": {
"include": [
"appsettings.json",
"hosting.json",
"project.json",
"web.config"
]
},
您应该将"appsettings.Production.json"
添加到此数组中。
基于评论的更新:
请注意,appsettings.*.json
,appsettings.development.json
和appsettings.staging.json
等所有appsettings.production.json
文件始终会在所有环境中结束。您不能使用project.json
来处理此问题,因为它不支持任何条件规则。这将在project.json
为replaced back到msbuild
和.csproj
时更改。如果这对您的应用程序至关重要,请考虑使用其他配置存储,如环境变量,数据库等。
请注意,该顺序很重要,因为如果它们存在于多个位置,则确定将应用哪些设置。来自documentation:
指定配置源的顺序很重要,因为这确定了在多个位置存在设置时应用设置的优先级。在下面的示例中,如果appsettings.json和环境变量中都存在相同的设置,则环境变量中的设置将是使用的设置。如果设置存在于多个位置,则指定的最后一个配置源“获胜”。 ASP.NET团队建议最后指定环境变量,以便本地环境可以覆盖已部署配置文件中设置的任何内容。
答案 1 :(得分:15)
在{
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings.json",
"appsettings.Production.json",
"web.config"
]
},
}
中,有{
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings*.json",
"web.config"
]
},
}
部分。这将列出发布时将包含的所有文件和文件夹。您需要更新自己的内容
Files.copy()
你也可以使用globbing模式,所以你应该发现它也有效(我没有测试过这个)
{
"data": [
{
"number": 123,
"animal": "mush"
},
{
"number": "123",
"animal": ""
}
],
"animal_id": 1
}
答案 2 :(得分:10)
对于新的csproj
项目格式,您必须添加包含内容的新ItemGroup
<ItemGroup>
<Content Include="appsettings.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Include="appsettings.Production.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
如果您有多个appsettings.{env}.json
个文件,只需在同一个Content
内重复ItemGroup
标记,所有设置文件最终都会在发布文件夹中。
正如评论中所提到的,更清晰的解决方案是使用通配符include:
<ItemGroup>
<Content Include="appsettings*json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
您的所有appsettings
个文件都将发布!
答案 3 :(得分:3)
发现了Visual Studio方法的三步构建,用于发布特定于环境的应用设置文件(Windows,PowerShell)。
此方法将发布
步骤1。更新csproj:
<!-- App Settings -->
<ItemGroup>
<Content Remove="appsettings.json" />
<Content Remove="appsettings.*.json" />
</ItemGroup>
<ItemGroup>
<Content Include="appsettings.json" CopyToOutputDirectory="Always" />
<Content Include="appsettings.$(ASPNETCORE_ENVIRONMENT).json" DependentUpon="appsettings.json" CopyToOutputDirectory="Always" />
</ItemGroup>
步骤2。在PowerShell中设置环境变量:
# Read
[Environment]::GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "User")
# Output: empty string if not set or 'Staging' in my case
# Set environment variable "User" or "Machine" level
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "User")
步骤3。然后关闭并重新打开Visual Studio解决方案,以使Visual Studio能够查看环境变量并相应地重新加载项目结构。
最后一步。运行发布。
注意:发布配置文件环境变量不影响发布配置。此方法使用PowerShell设置环境变量并启用特定于环境的发布。有关环境变量的更多详细信息,请参见link。
答案 4 :(得分:1)
在Visual Studio 2017 15.3之后
编辑.csproj文件以手动排除文件/文件夹不被发布
<ItemGroup>
<Content Remove="appsettings.Development.json" />
</ItemGroup>
答案 5 :(得分:0)