如何将含虚拟目录的应用发布至Azure App Service并保留指定结构
实现Azure App Service向IIS应用目录父目录发布内容的方案
不用重构整个应用也能搞定这个问题,我给你几个实用的、实际验证过的方案:
方案一:修改Visual Studio发布配置文件(最直接)
Visual Studio默认只会发布Web项目本身的内容,但我们可以通过自定义.pubxml配置文件,把父目录里的Config、Shared、Transform目录一起发布到Azure上wwwroot的父目录:
- 打开你的Web项目,找到
Properties > PublishProfiles目录,打开现有的发布配置文件(比如Azure.pubxml),如果没有就新建一个发布配置。 - 在文件末尾添加以下XML代码,用来包含并复制父目录的内容:
<ItemGroup> <!-- 包含Config目录所有文件,发布到wwwroot的父目录 --> <Content Include="..\Config\**"> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <TargetPath>..\Config\%(RecursiveDir)%(Filename)%(Extension)</TargetPath> </Content> <!-- 包含Shared目录所有文件 --> <Content Include="..\Shared\**"> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <TargetPath>..\Shared\%(RecursiveDir)%(Filename)%(Extension)</TargetPath> </Content> <!-- 包含Transform目录所有文件 --> <Content Include="..\Transform\**"> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <TargetPath>..\Transform\%(RecursiveDir)%(Filename)%(Extension)</TargetPath> </Content> </ItemGroup>
这里的TargetPath用..\是因为Visual Studio默认把Web项目发布到Azure的site\wwwroot目录,..\就指向了site目录(也就是wwwroot的父目录),刚好和你本地的app\目录结构对应。
3. 发布时选择这个自定义的配置文件,完成后Azure上的目录结构会变成:
site\ ├─ Config\ ├─ Shared\ ├─ Transform\ └─ wwwroot\ (对应本地Web\目录)
方案二:用Azure DevOps Pipeline做CI/CD(适合自动化发布)
如果你们用DevOps来管理发布流程,可以通过Pipeline步骤来拼接完整的目录结构:
- 先把Web项目发布到构建 artifacts 的
wwwroot目录 - 再把本地
app\下的Config、Shared、Transform目录复制到artifacts的根目录 - 最后把整个artifacts目录发布到Azure App Service
参考YAML片段:
# 构建并发布Web项目到wwwroot - task: VSBuild@1 inputs: solution: '**/Web.csproj' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)/wwwroot"' # 复制Config目录 - task: CopyFiles@2 inputs: SourceFolder: '$(Build.SourcesDirectory)/app/Config' TargetFolder: '$(Build.ArtifactStagingDirectory)/Config' # 复制Shared目录 - task: CopyFiles@2 inputs: SourceFolder: '$(Build.SourcesDirectory)/app/Shared' TargetFolder: '$(Build.ArtifactStagingDirectory)/Shared' # 复制Transform目录 - task: CopyFiles@2 inputs: SourceFolder: '$(Build.SourcesDirectory)/app/Transform' TargetFolder: '$(Build.ArtifactStagingDirectory)/Transform' # 发布到Azure App Service - task: AzureRmWebAppDeployment@4 inputs: ConnectionType: 'AzureRM' azureSubscription: '你的Azure订阅名称' appType: 'webApp' WebAppName: '你的应用服务名称' packageForLinux: '$(Build.ArtifactStagingDirectory)/**'
方案三:手动打包上传到Kudu(临时应急用)
如果只是临时发布,不想改配置,可以手动打包上传:
- 本地把
app\目录下的所有内容(包括Web、Config、Shared、Transform)打包成ZIP文件 - 打开你的Azure App Service的Kudu控制台(访问
https://<你的应用名>.scm.azurewebsites.net) - 进入
Debug console > PowerShell,导航到site\目录 - 上传刚才的ZIP包,然后用
Expand-Archive命令解压到site\目录,这样wwwroot会自动作为应用根目录,其他目录就在它的父目录里了。
注意事项
- 如果你的应用设置了
WEBSITE_RUN_FROM_PACKAGE=1,发布后的文件是只读的,要是需要修改Config里的配置,建议把这个设置改成0,或者用Azure App Configuration来管理配置内容。 - Web项目里引用父目录文件时,相对路径要正确,比如
../Config/appsettings.config,在Azure上对应的就是D:\home\site\Config\appsettings.config,和本地的引用逻辑一致。
内容的提问来源于stack exchange,提问作者sirdank
相关产品推荐
相关产品推荐

