无法从构建工件提取Azure Function,寻求.NET Framework 4.8部署配置方案
Why Your Current Archive Task Fails
Your ArchiveFiles@2 task can't find the bin/Release/net48 folder because the VSBuild@1 task with /p:DeployOnBuild=true skips generating the project's local bin directory. Instead, it publishes the Azure Function directly to the $(Build.ArtifactStagingDirectory) root, mixing it with other solution artifacts.
Solution 1: Modify the Function Project's .csproj (Simplest)
Add a property to your Azure Function project's .csproj file to redirect its publish output to a dedicated folder:
<PropertyGroup> <!-- Publish the function to a separate folder in the staging directory --> <PublishDir>$(Build.ArtifactStagingDirectory)/FunctionApp</PublishDir> </PropertyGroup>
Update your pipeline to archive this dedicated folder:
- task: VSBuild@1 displayName: 'Build Solution' env: SONAR_DOTNET_ENABLE_CONCURRENT_EXECUTION: true inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' msbuildArgs: '/p:OutputPath=$(Build.ArtifactStagingDirectory) /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=false /p:SkipInvalidConfigurations=true' maximumCpuCount: true - task: ArchiveFiles@2 displayName: 'Archive Function' inputs: rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/FunctionApp' archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/$(functionName).zip' replaceExistingArchive: true # Publish separate artifacts for web projects and the function - publish: $(Build.ArtifactStagingDirectory)/_PublishedWebsites displayName: Publish Web Artifacts artifact: web-drop - publish: $(Build.ArtifactStagingDirectory)/$(functionName).zip displayName: Publish Function Artifact artifact: function-drop
Solution 2: Split Build and Publish Tasks (No Project File Changes)
Separate the build and publish steps to isolate the function's output:
- Build the entire solution (without publishing):
- task: VSBuild@1 displayName: 'Build Entire Solution' env: SONAR_DOTNET_ENABLE_CONCURRENT_EXECUTION: true inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' msbuildArgs: '/p:OutputPath=$(Build.ArtifactStagingDirectory)/Binaries /p:SkipInvalidConfigurations=true' maximumCpuCount: true
- Publish web projects to their own directory:
- task: VSBuild@1 displayName: 'Publish Web Projects' inputs: solution: '**/*Web*.csproj' # Adjust filter to match your web project names platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=false /p:PublishDir=$(Build.ArtifactStagingDirectory)/Websites /p:SkipInvalidConfigurations=true'
- Publish the Azure Function to a dedicated folder:
- task: VSBuild@1 displayName: 'Publish Azure Function' inputs: solution: '**/$(functionName).csproj' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' msbuildArgs: '/p:DeployOnBuild=true /p:PublishDir=$(Build.ArtifactStagingDirectory)/FunctionApp /p:SkipInvalidConfigurations=true'
- Archive and publish artifacts:
- task: ArchiveFiles@2 displayName: 'Archive Function' inputs: rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/FunctionApp' archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/$(functionName).zip' replaceExistingArchive: true - publish: $(Build.ArtifactStagingDirectory)/Websites/_PublishedWebsites displayName: Publish Web Artifacts artifact: web-drop - publish: $(Build.ArtifactStagingDirectory)/$(functionName).zip displayName: Publish Function Artifact artifact: function-drop
Both solutions will give you a separate artifact for the Azure Function, making it easy to deploy independently from your web projects.
内容的提问来源于stack exchange,提问作者Ask

