You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Azure DevOps部署时appsettings.Test.json输出到服务器?

问题:阻止appsettings.Test.json被部署到服务器但保留在代码库

我有一个.NET Core 8.0 Web应用,包含appsettings.json和appsettings.Test.json文件。目前正通过Azure DevOps流水线构建并部署该应用,同时正从使用appsettings.Test.json文件迁移为通过流水线向appsettings.json注入环境变量。需要阻止仍存于代码仓库的appsettings.Test.json文件被输出到服务器(该文件需保留至迁移完成并验证功能后)。

核心问题:该文件未出现在已发布的工件中,但仍会被部署到服务器,手动删除后每次流水线运行都会重新出现。

已尝试的无效配置

我已在.csproj文件中添加以下多种组合配置,但均未生效:

<ItemGroup>
  <Content Remove="appsettings.*.json" />
</ItemGroup>

<ItemGroup>
  <None Include="appsettings.*.json" />
</ItemGroup>

<ItemGroup>
  <Content Update="appsettings.*.json" CopyToPublishDirectory="Never" />
</ItemGroup>

流水线配置详情

主流水线YAML

trigger:
  batch: true
  branches:
    include:
    - test
  paths:
   exclude:
     - src/ETLService/*

pool:
  vmImage: 'windows-latest'

variables:
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  solution: '**/WebHost.sln'
  packageFolderName: 'WebHost'
  artifactName: 'WebAPI'
  IISWebsiteName: 'API'

stages: 
  - stage: BuildAndTest
    displayName: 'Build and test'
    jobs:
      - job: 
        displayName: '${{ variables.artifactName }}'
        steps:
            - template: PipelineTemplates/BuildAndTest.yml
            - template: PipelineTemplates/PublishWebArtifact.yml
  - stage: DeployToTest
    displayName: 'Deploy to test'
    variables:
    - group: APITest
    jobs:
      - deployment: DeployAPI
        displayName: 'API'
        environment: 'Test.TEST-SERVER'
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: none
                - download: 'current'
                  name: 'DownloadBuildArtifacts'
                  displayName: 'Download build artifacts'
                  artifact: '${{ variables.artifactName }}'
                - template: PipelineTemplates/DeployToIIS.yml

BuildAndTest.yml

steps:
  - task: NuGetToolInstaller@1
    displayName: "Nuget install"
    
  - task: NuGetCommand@2
    displayName: "Nuget restore"
    inputs:
      restoreSolution: '$(solution)'
      
  - task: DotNetCoreCLI@2
    displayName: 'Dotnet build'
    inputs:
      command: 'build'
      projects: '$(solution)'
      arguments: '--configuration $(buildConfiguration)'

  - task: DotNetCoreCLI@2
    displayName: 'Dotnet test'
    inputs:
      command: 'test'
      projects: '$(solution)'
      arguments: '--configuration $(buildConfiguration)'

PublishWebArtifact.yml

steps:
  - task: DotNetCoreCLI@2
    displayName: "Dotnet Publish"
    inputs:
      command: 'publish'
      publishWebProjects: true
      arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
      zipAfterPublish: false

  - task: PublishBuildArtifacts@1
    displayName: "Publish Web Artifact"
    inputs:
      PathtoPublish: '$(Build.ArtifactStagingDirectory)'
      ArtifactName: '$(artifactName)'
      publishLocation: 'Container'

DeployToIIS.yml

steps:
  - task: IISWebAppManagementOnMachineGroup@0
    name: 'StopIIS'
    displayName: 'Stop IIS website'
    inputs:
      IISDeploymentType: 'IISWebsite'
      ActionIISWebsite: 'StopWebsite'
      StartStopWebsiteName: '$(IISWebsiteName)'
  - task: IISWebAppDeploymentOnMachineGroup@0
    inputs:
      WebSiteName: '$(IISWebsiteName)'
      Package: '$(Pipeline.Workspace)\$(artifactName)\$(packageFolderName)'
      TakeAppOfflineFlag: true
      JSONFiles: 'appsettings.json'
  - task: IISWebAppManagementOnMachineGroup@0
    name: 'StartIIS'
    displayName: 'Start IIS website'
    inputs:
      IISDeploymentType: 'IISWebsite'
      ActionIISWebsite: 'StartWebsite'
      StartStopWebsiteName: '$(IISWebsiteName)'

解决办法

1. 在发布命令中直接排除文件

修改PublishWebArtifact.yml中的DotNet Publish任务,添加MSBuild参数强制排除目标文件,优先级高于csproj配置:

- task: DotNetCoreCLI@2
  displayName: "Dotnet Publish"
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory) /p:ExcludeFilesFromDeployment=appsettings.Test.json'
    zipAfterPublish: false

2. 验证发布后的工件内容

在Build阶段添加PowerShell任务,确认发布后的文件夹中是否真的没有appsettings.Test.json,排除工件传递环节的问题:

- task: PowerShell@2
  displayName: 'Check published files'
  inputs:
    targetType: 'inline'
    script: 'Get-ChildItem -Path $(Build.ArtifactStagingDirectory)\$(packageFolderName) -Recurse'

3. 修正csproj配置(明确指定单个文件)

替换之前的csproj配置,直接针对appsettings.Test.json设置规则,避免通配符匹配失效:

<ItemGroup>
  <Content Remove="appsettings.Test.json" />
  <None Include="appsettings.Test.json">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </None>
</ItemGroup>

4. 排查部署任务的额外操作

确认DeployToIIS.yml中没有额外的文件复制步骤,且部署阶段的checkout: none配置生效(不会拉取代码库文件到服务器)。

内容的提问来源于stack exchange,提问作者Habhome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:43:23