2017-07-07 128 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