无法在MSBuild中访问ArtifactStagingDirectory变量

3

在我的构建过程中,我试图将一个文件夹复制到工件文件夹(\myserver\d$\TFBuild-Agent01\66\a)。

因此,我将以下内容放入.csproj文件中:

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

这让我很困惑

错误 MSB4184:表达式 """.ArtifactStagingDirectory" 无法评估。找不到方法 'System.String.ArtifactStagingDirectory' *

我在网上查到的所有信息都说 $(Build.ArtifactStagingDirectory) 是解决方法。但它并不起作用。

使用 Visual Studio 2015 和 TFS 2015 进行构建

这个也不行:

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

表达式"$Env:BUILD_ARTIFACTSTAGINGDIRECTORY"无法评估.*

这不会出现错误,但是看起来%BUILD_ARTIFACTSTAGINGDIRECTORY%被替换为空字符串:

 <Exec Command="xcopy.exe  Databases &quot;%BUILD_ARTIFACTSTAGINGDIRECTORY%\Databases&quot; /i /e /y /d" /> 
2个回答

7
你已经混合使用了访问代理允许的构建变量的方式。使用$(some.variable)语法是由代理本身解释的。MSBuild有一个类似的语法 - $(PropertyName) - 它执行不同的操作 - 它提供对msbuild属性的访问,并且不允许在名称中使用点(.),因为你可以使用点来调用值上的函数(例如$(OutputPath.Substring(3)))。
当你想要从MSBuild引用构建变量时,需要引用代理设置的环境变量。这是可能的,因为MSBuild将所有环境变量作为全局属性使用其属性语法使其可访问。对于Build.ArtifactStagingDirectory的环境变量是BUILD_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>

到处都在寻找像这样的示例,谢谢!文档本身在其他所有上下文和场景中都有示例,唯独缺少最有用的一个!! - Warren

0

好的,我猜这是因为我正在使用Visual Studio来构建我的解决方案,所以我无法从.csproj访问$(Build.StagingDirectory)。然而,它作为属性通过命令行传递给“Visual Studio Build”构建步骤:

/p:OutDir="$(Build.StagingDirectory)"

这样可以通过以下方式访问

<Exec Command="xcopy.exe  Databases &quot;$(OutDir)\Databases&quot; /i /e /y /d" />

1
不确定您的问题是否已解决,但为了调试此类情况,MSBuild Message任务非常有用:<Message Text="Build.ArtifactStagingDirectory=$(Build.ArtifactStagingDirectory)" Importance="high"/> 这样,您就可以看到它在csproj内部实际设置的值。 - ackh

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