Visual Studio Online 构建步骤中的 PackageLocation 参数被忽略

6
我有一个似乎行为异常的Visual Studio Online构建定义,但我不确定是否只是配置不正确。其中一个构建步骤的配置如下:
类型:Visual Studio Build
解决方案:**\mysolutionfile.sln
MSBuild参数:/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.stagingDirectory)"
构建成功运行,构建日志显示msbuild命令执行如下:
"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe" "C:\a\1\s\Code\mysolutionfile.sln" /nologo /nr:false /dl:CentralLogger,(more removed for brevity) /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="C:\a\1\a" /p:platform="any cpu" /p:configuration="release" /p:VisualStudioVersion="14.0" /p:_MSDeployUserAgent="VSTS_6efdabeb-1c75-43a7-96b2-f40e19a68a35_build_14_122"
可以看到,包位置被正确设置为:/p:PackageLocation="C:\a\1\a"
然而,在构建日志的后面,打包步骤显示了以下日志条目:
执行命令["C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe" -source:manifest='C:\Users\buildguest\AppData\Local\Temp\PublishTemp\obj\mysolution55\SourceManifest.xml' -dest:package='C:\a\1\s\Code\mysolutionfile\bin\Release\MSDeployPackage\mysolutionfile.zip' -verb:sync -replace:match='C:\\Users\\buildguest\\AppData\\Local\\Temp\\PublishTemp\\mysolutionfile55\\',replace='website\' -retryAttempts:20 -disablerule:BackupRule]
可以看到,在这种情况下,包被发送到-dest:package='C:\a\1\s\Code\mysolutionfile\bin\Release\MSDeployPackage\mysolutionfile.zip',而且确实是zip文件的存放位置。
据我所知,这看起来是错误的。我想要将打包的应用程序二进制文件和文件放在暂存目录中,但是msbuild在某个地方覆盖了我的设置,并将它们放入源代码检出文件夹中。
如果相关,请注意,该解决方案包含两个项目:一个针对完整.NET Framework的ASP.NET Core Web应用程序和一个可移植类库。

在构建配置中我是否做错了什么?

2个回答

3

我在我的TFS环境中重现了您的问题,并且得到了相同的结果。软件包位于“C:\ a \ 1 \ s”文件夹下,而不是“C:\ a \ 1 \ a”。

作为解决方法,您可以添加一个复制文件步骤,将软件包从源文件夹复制到$(build.stagingDirectory)路径。


谢谢 - 这个解决方法有效。不过这看起来像是一个 bug 吗?如果是,我应该在哪里报告呢?我不确定问题是出在 MSBuild 还是 VSO 运行构建的方式上。 - John
@John 反馈链接为:https://connect.microsoft.com/VisualStudio/feedback/CreateFeedback.aspx。你可以在这里报告。 - Tingting0929
谢谢。MS Connect让我去另一个网站提交错误报告。如果有人对此感兴趣,可以在https://developercommunity.visualstudio.com/content/problem/12933/visual-studio-online-build-step-packagelocation-be.html上查看。 - John
另一个更新 - 这已被确认为 ASP.NET Core 中的一个错误,并正在此处跟踪:https://github.com/aspnet/websdk/issues/106 - John

1
我猜想它没有按照你的预期工作是因为变量名应该是Build.ArtifactStagingDirectory而不是build.stagingDirectory

例如:

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:Configuration=Release /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)"'
    #msbuildArgs: '/T:"MyProject1" /p:OutDir=$(Build.ArtifactStagingDirectory) /nowarn:FS0049'

- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: '$(Build.ArtifactStagingDirectory)'
    artifactName: MyWebSiteArtefactZIP

还有另一种部署方式:

如果您已创建了发布配置文件(可以使用Visual Studio完成),也可以直接从MSBuild发布,您可以将Web应用程序的用户名/密码放入Azure DevOps管道变量中并使用它们:

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:Configuration=Release /P:DeployOnBuild=true /P:PublishProfile="MyPublishProfile.pubxml" /P:Username=$(username);Password=$(password)'

“/p:PackageLocation="$(Build.ArtifactStagingDirectory)"”是如何工作的?如果我在本地尝试,会出现一个错误,指出“必须是文件而不是目录”。但是,“ArtifactStagingDirectory”始终是一个目录?! - Marcus.D
$(Build.ArtifactStagingDirectory) 是 Azure DevOps 创建的一个变量。它包含一个目录路径。https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services - Tony
感谢您的回复。但这并不能回答我的问题:为什么在AzureDevOps中使用“只是目录路径”作为“PackageLocation”,即使MSBuild本地显示它必须是文件路径(而不是目录),它也可以正常工作?这是因为某些环境变量吗? - Marcus.D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接