Can't access ArtifactStagingDirectory variable in MSBuild

mhe*_*384 3 msbuild tfs csproj tfsbuild

During my build process I'm trying to copy a folder to the artifacts folder (\myserver\d$\TFBuild-Agent01\66\a).

So I put this in the .csproj file:

<Target Name="BeforeBuild">
  <Exec 
    Command="xcopy.exe  Databases &quot;$(Build.ArtifactStagingDirectory)\Databases&quot; /i /e /y /d" />
</Target>
Run Code Online (Sandbox Code Playgroud)

This gets me

Error MSB4184: The expression """.ArtifactStagingDirectory" cannot be evaluated. Method 'System.String.ArtifactStagingDirectory' not found*

Everything I can find online says that $(Build.ArtifactStagingDirectory) is the way to do it. But it doesn't work.

Building with Visual Studio 2015 on TFS 2015

This doesn't work either:

<Exec 
Command="xcopy.exe  Databases &quot;$($Env:BUILD_ARTIFACTSTAGINGDIRECTORY)\Databases&quot; /i /e /y /d" />
Run Code Online (Sandbox Code Playgroud)

The expression "$Env:BUILD_ARTIFACTSTAGINGDIRECTORY" cannot be evaluated.*

This doesn't error, but it looks like %BUILD_ARTIFACTSTAGINGDIRECTORY% gets replaced as an empty string:

 <Exec Command="xcopy.exe  Databases &quot;%BUILD_ARTIFACTSTAGINGDIRECTORY%\Databases&quot; /i /e /y /d" /> 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ich 7

您一直在混合访问代理允许您访问的构建变量的方法。使用的语法$(some.variable)由代理本身解释。MSBuild 有一个类似的语法——$(PropertyName)它做一些不同的事情——它允许访问 msbuild 属性,并且不允许.在它的名称中使用点 ( ),因为您可以使用点来调用值上的函数(例如$(OutputPath.Substring(3)))。

当您想要从 MSBuild 引用构建变量时,您需要引用代理设置的环境变量。这是可能的,因为 MSBuild 使用其属性语法将所有环境变量作为全局属性进行访问。环境变量Build.ArtifactStagingDirectoryBUILD_ARTIFACTSTAGINGDIRECTORY这样你可以在 MSBuild 中使用它$(BUILD_ARTIFACTSTAGINGDIRECTORY)

当作为 TFS/VSTS 构建的一部分运行时,我一直在此脚本中成功使用它来默认属性(PublishBaseDir是稍后使用的自定义属性):

<PropertyGroup>
  <!-- Default artifact staging directory when built via VSTS / TFS agent -->
  <PublishBaseDir Condition="'$(PublishBaseDir)' == '' and '$(BUILD_ARTIFACTSTAGINGDIRECTORY)' != '' ">$(BUILD_ARTIFACTSTAGINGDIRECTORY)</PublishBaseDir>

  <!-- If not built on a known agent, use a "publish" subdir next to this file -->
  <PublishBaseDir Condition="'$(PublishBaseDir)' == ''">$(MSBuildThisFileDirectory)publish\</PublishBaseDir>

  <!-- Normalize directory if set manually or through ENV var -->
  <PublishBaseDir Condition="!HasTrailingSlash('$(PublishBaseDir)')">$(PublishBaseDir)\</PublishBaseDir>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)