Azure DevOps发布管道:复制app_offline.htm至应用根目录的正确Target Folder值
问题背景
我正尝试将Views目录下的app_offline.htm文件复制到Web服务器解决方案的根目录,当前使用包含IIS Web App Deploy task的发布管道部署至Web服务器,部署前需完成该文件的复制操作。
任务流程如下:
- IIS Web App Manage
- Extract files
- Copy files:将app_offline.htm复制到根目录
- IIS Web App Deploy
- PS脚本:从根目录移除app_offline.htm
但Copy files任务无法完成复制,使用的YAML配置如下:
steps: - task: CopyFiles@2 displayName: 'Add app_offline.htm to /' inputs: SourceFolder: '$(System.DefaultWorkingDirectory)/extracted' Contents: 'Views\app_offline.htm' TargetFolder: /
任务能找到Views文件夹中的app_offline.htm,但无论设置何种Target Folder值,都无法将文件复制到根目录,每次要么无法复制(大概率是找不到目标目录),要么提示:
文件C:\azagent[...]\extracted\Views\app_offline.htm已存在于D:\Inetpub[...]\Views\app_offline.htm
即找到的目标路径会被识别为当前文件所在的/Views/文件夹,无法映射到根目录。我已尝试以下Target Folder值:
/ <- 2 \ <- 2 $(Build.Repository.LocalPath)/ <- 1 $(Build.Repository.LocalPath)\ <- 1 $(Build.Repository.LocalPath) <- 1 D:\Inetpub[...] <- 2 D:\Inetpub[...] <- 2 ../ <- 1 $(Agent.BuildDirectory) <- 1 $(Pipeline.Workspace) <- 1
***** 更新 *****
应用结构说明:根目录下包含Views文件夹、web.config等文件,Views文件夹内存放app_offline.htm文件。
核心原因
CopyFiles@2任务默认会保留源文件相对于SourceFolder的目录结构。当你设置SourceFolder: '$(System.DefaultWorkingDirectory)/extracted'和Contents: 'Views\app_offline.htm'时,文件的相对路径是Views/app_offline.htm,因此会自动在TargetFolder下创建Views子目录并将文件复制进去,而非直接放到根目录。
正确配置方案
方案1:调整源文件夹指向Views目录
直接将SourceFolder设置为Views文件夹路径,Contents仅指定文件名,目标文件夹设为应用根目录:
steps: - task: CopyFiles@2 displayName: 'Add app_offline.htm to root' inputs: SourceFolder: '$(System.DefaultWorkingDirectory)/extracted/Views' Contents: 'app_offline.htm' TargetFolder: '$(System.DefaultWorkingDirectory)/extracted'
方案2:启用文件夹扁平化选项
保持原有源文件夹和内容匹配规则,开启flattenFolders: true以忽略源文件的相对路径结构,直接将文件复制到目标文件夹根目录:
steps: - task: CopyFiles@2 displayName: 'Add app_offline.htm to root' inputs: SourceFolder: '$(System.DefaultWorkingDirectory)/extracted' Contents: 'Views\app_offline.htm' TargetFolder: '$(System.DefaultWorkingDirectory)/extracted' flattenFolders: true
直接复制到IIS服务器根目录的配置
如果需要直接将文件复制到Web服务器的IIS根目录(如D:\Inetpub\YourWebAppRoot),需确保代理服务账户拥有该路径的读写权限,同时使用以下配置:
steps: - task: CopyFiles@2 displayName: 'Add app_offline.htm to IIS root' inputs: SourceFolder: '$(System.DefaultWorkingDirectory)/extracted' Contents: 'Views\app_offline.htm' TargetFolder: 'D:\Inetpub\YourWebAppRoot' flattenFolders: true
注意事项
- 避免使用
/或\这类模糊路径,务必指定明确的绝对路径或预定义变量(如$(System.DefaultWorkingDirectory)/extracted)。 - 若你的发布管道是将
$(System.DefaultWorkingDirectory)/extracted下的所有内容部署到IIS,选择方案1或2将文件复制到该目录根目录即可,后续IIS Web App Deploy任务会自动同步到Web服务器根目录。
内容的提问来源于stack exchange,提问作者nickornotto

