2017-07-07 105 views
0

在我的构建过程中,我试图将文件夹复制到工件文件夹(\ myserver \ d $ \ TFBuild-Agent01 \ 66 \ a)。无法访问MSBuild中的ArtifactStagingDirectory变量

所以我把这个在.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)就是这样做的方法。但它不起作用。在2015年TFS

建设与Visual Studio 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

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

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

我已经成功地用它在this script拖欠物业时作为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> 
0

OK,我想这是因为我使用Visual Studio来构建我的解决方案,我无法从.csproj访问$(Build.StagingDirectory)。然而,它传递的命令行上的“Visual Studio中建立”盖步作为一个属性:

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

这样可以通过做

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

不知道你的问题现在已经解决了但为了调试这种情况下,MSBuild消息任务是有用的: 这样你就可以看到它具有的值真的被设置在csproj里面 – ackh