如何获取我的工件在发布步骤中被提取到的目录?

How to get the directory my artifact is extracted to during a release step?

我正在使用 VSTS 部署 asp.net Web 应用程序。我们正在改变我们部署转换后的 web.config 文件的方式,因为我们在最近的一次生产 post 中被烧毁,因为在 "IIS Web App Deploy. Our new plan is to use the CodeAssassin.ConfigTransform" nuget 任务期间文件没有正确转换,我们所有的配置转换作为构建的一部分进行转换。这些可以由我们的开发人员在本地 validated/inspected 合并到构建工件中。

所以对于我的问题, 基本上在我的构建工件中,在我的 Web 项目的根目录下,我们会找到转换后的 web.config 文件,例如web.dev.config.transformed、web.qa.config.transformed、web.dev.config.transformed 等

作为我发布过程中的一个新步骤,根据环境,我想在 "IIS Web App Deploy" 任务将更改推送到网络服务器之前,在我的工件中复制正确的文件。在所有变量替换之后的非常基本的级别上,复制命令看起来像这样。

copy-item ?????web.dev.config.transformed -Destination ?????web.config

我需要更换??????使用我的工件被提取的路径,例如

C:\vstsagent\A1\_work\r1\a\temp_web_package_7996773376015784\Content\C_C\VSTS_agent\_work\s\My.Web.Project\obj\Release\Package\PackageTmp\

我查看了每个 build/release 变量(感谢 Gian Maria Dump all environment variables during a TFS / VSTS Build),但我看不到任何可以从变量访问的路径。

我显然在这里遗漏了一些简单的东西...因为其他任务可以使用这些信息吗?

感谢任何帮助!

您要查找的变量是$(System.DefaultWorkingDirectory)

这将为您提供路径的第一部分。之后,您可以像这样附加自己的文件夹和文件:

$(System.DefaultWorkingDirectory)\My.Web.Project\obj\Release\Package\PackageTmp\

您还可以在构建定义中使用 Copy File task (v2),然后选中 Flatten Files。这将从工件的路径中删除不需要的目录。这将使您更容易在您的版本中使用工件

首先,temp_web_package_XXX.zip 文件由 IIS Web App Deploy 任务 生成 File转换和变量替换(提取您的包 > 进行转换 > 将文件归档到临时包 (temp_web_package_xxx.zip)),因此您无需处理临时包文件。

其次,您只需要处理您的包文件(例如提取包文件 > 将文件复制到文件夹)和路径 $(System.DefaultWorkingDirectory)/[build definition name]/[Artifact name (Specified in Publish Build Artifacts task)]/*.zip.

您可以通过在 Visual Studio BuildMSBuild[=27 中指定 /P:PackageTempRootDir="" MSBuild 参数从包中删除源路径结构=] 任务。对于 dotnet 核心项目,使用 .NET Core(命令:发布;检查 Zip 发布的项目选项)任务。

之后,文件夹结构如[WebApp]\Content\D_C\PackageTmp