我正在开发一个 ASP.NET 6 Web API 项目,该项目需要使用针对不同环境的多个不同配置文件进行发布。对于每个环境,appsettings.{EnvironmentName}.json 已使用自定义配置添加到项目中。虽然在运行应用程序时注入了正确的环境设置,但我无法阻止发布过程将所有各种环境应用程序设置文件包含到发布文件夹中。 我尝试了很多所谓的解决方案,例如:
<ItemGroup>
<Content Update="appsettings.{Environment1}.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</Content>
<Content Update="appsettings.{Environment2}.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</Content>
</ItemGroup>
在环境的 .pubxml 文件的“项目”节点中...
或
<ItemGroup>
<Content Remove="appsettings.{Environment1}.json" />
</ItemGroup>
完全没有成功。
请注意,我无法从 .csproj xml 中删除这些文件,因为我需要它们全部,但我无法将它们全部移动到 Azure 上的发布文件夹中,因此我想根据我使用的配置文件排除它们发布。
如何才能成功实现这一目标?
在构建之前设置环境变量,如下所示:
[Environment]::SetEnvironmentVariable("DOTNET_ENVIRONMENT", "PRE", "Machine")
...
<ItemGroup>
<Content Update="appsettings.QA.json">
<DependentUpon>appsettings.json</DependentUpon>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="appsettings.PRE.json">
<DependentUpon>appsettings.json</DependentUpon>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="appsettings.LIVE.json">
<DependentUpon>appsettings.json</DependentUpon>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Remove="appsettings.QA.json" Condition="'$(DOTNET_ENVIRONMENT)' != 'QA'"/>
<Content Remove="appsettings.PRE.json" Condition="'$(DOTNET_ENVIRONMENT)' != 'PRE'"/>
<Content Remove="appsettings.LIVE.json" Condition="'$(DOTNET_ENVIRONMENT)' != 'LIVE'"/>
</ItemGroup>
...
然后在构建过程中,您只能获得 appsettings.json 和环境的:
csproj 配置也会影响您在 IDE 中看到的内容:
注意,您在上面的屏幕截图中看到
appsettings.QA.json
,但这是因为我的 IDE 在启动时读取环境变量,因此在我的本地计算机上,每当我更改本地环境时,我都必须重新启动 IDE。
我认为通过修改上面的 csproj 更改可以改进这一点。
只要记住在构建之前设置 DOTNET_ENVIRONMENT
就可以了。
请注意,如果您想将相同的构建输出重新部署/提升到另一个环境,这可能不是您想要的,但这可以帮助一些没有发布管道的人。