【问题标题】:Specifiy files in publish profile to be removed?指定要删除的发布配置文件中的文件?
【发布时间】:2019-07-28 09:52:19
【问题描述】:

我有 3 个不同的设置文件用于 .NET Core 2.2 应用程序
appsettings.json
appsettings.Development.json
appsettings.Test.json

我正在使用针对特定构建配置(例如测试)的发布配置文件,并且在我的发布配置文件中,我添加了它以尝试删除我不想部署的 appsettings 文件。将生产设置部署到开发服务器毫无意义...

  <PropertyGroup>
    <ExcludeFilesFromDeployment>appsettings.json</ExcludeFilesFromDeployment>
    <ExcludeFilesFromDeployment>appsettings.Development.json</ExcludeFilesFromDeployment>
  </PropertyGroup>

但是,当我发布时,由于在 Visual Studio 中,所有 3 个文件都存在。如何指定其他 2 个文件在发布时被删除?

我也尝试将其放入我的 csproj 文件中,但所有 3 个文件最终都被发布了

  <ItemGroup>
    <None Update="appsettings.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Test' "/>
    <None Update="appsettings.Development.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Test' "/>

    <None Update="appsettings.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Release' "/>
    <None Update="appsettings.Test.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Release' "/>

  </ItemGroup>

【问题讨论】:

  • 构建配置与 ASP.NET Core 应用程序无关。由于没有像配置转换之类的东西,因此可以将相同的已发布应用程序代码放在 any 环境中。最终控制加载哪些特定于环境的配置的是ASPNETCORE_ENVIRONMENT 变量的值,而不是您发布的方式。这就是发布包含所有文件的原因;没有机制可以提前知道哪些相关或不相关。
  • 在实践中这几乎不是问题。无论如何,这些 JSON 文件中不应包含任何秘密信息,所以谁在乎您的开发服务器上是否存在 appsettings.Production.json

标签: visual-studio asp.net-core msbuild csproj


【解决方案1】:

不确定,但将其放入您的 .csproj 文件中以检查它是否有帮助。它适用于 vs2017,我这边的 .net 核心。

<ItemGroup Condition="'$(Configuration)' == 'Test'">
    <Content Remove="appsettings.Development.json" />
    <None Include="appsettings.Development.json" />
    <Content Remove="appsettings.json" />
    <None Include="appsettings.json" />
  </ItemGroup>

  <ItemGroup Condition="'$(Configuration)'=='Release'">
    <Content Remove="appsettings.Test.json" />
    <None Include="appsettings.Test.json" />
    <Content Remove="appsettings.json" />
    <None Include="appsettings.json" />
  </ItemGroup>

【讨论】:

    【解决方案2】:

    不是 100% 确定这一点,只是一个想法,您是否尝试过将它们设置为仅在与预期的构建配置匹配时复制,例如

      <ItemGroup>
        <None Update="appsettings.json" CopyToPublishDirectory="PreserveNewest" Condition=" '$(Configuration)' == 'Production' "/>
        <None Update="appsettings.Development.json" CopyToPublishDirectory="PreserveNewest" Condition=" '$(Configuration)' == 'Development' "/>
        <None Update="appsettings.Test.json" CopyToPublishDirectory="PreserveNewest" Condition=" '$(Configuration)' == 'Test' "/>
      </ItemGroup>
    

    另外请检查您的 .net 核心版本是否受https://github.com/dotnet/sdk/issues/881 影响

    【讨论】:

      【解决方案3】:

      通常我会为不同的部署(不同的机器)创建不同的构建配置,所以我将其他 appsettings 命名为构建配置名称。 所以我最终得到了这个小模式(在 .csproj 文件中)

      <Choose>
        <When Condition="'$(Configuration)' == 'Debug'">
          <ItemGroup>
            <None Include="appsettings*.json" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
          </ItemGroup>
        </When>
        <Otherwise>
          <ItemGroup>
            <Content Remove="appsettings*.json" />
      
            <None Include="appsettings.json;appsettings.$(Configuration).json" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
          </ItemGroup>
        </Otherwise>
      <Choose>
      

      【讨论】:

        猜你喜欢
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-23
        • 2015-10-12
        • 2014-10-08
        相关资源
        最近更新 更多