Няма достъп до променливата ArtifactStagingDirectory в MSBuild

По време на моя процес на изграждане се опитвам да копирам папка в папката с артефакти (\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" /> 

person mhenry1384    schedule 07.07.2017    source източник


Отговори (2)


Смесвате начини за достъп до променливите за изграждане, които агентът ви позволява. Синтаксисът, използващ $(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>
person Martin Ullrich    schedule 09.07.2017
comment
Търсих навсякъде пример като този, благодаря!. Самите документи имат примери във всеки друг контекст и сценарий ОСВЕН в най-полезния!! - person Warren; 23.01.2020

Добре, предполагам, че тъй като използвам Visual Studio, за да създам решението си, не мога да получа достъп до $(Build.StagingDirectory) от .csproj. Въпреки това, той се предава от командния ред на стъпката за изграждане на „Visual Studio Build“ като свойство:

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

Така че това може да бъде достъпно чрез правене

<Exec Command="xcopy.exe  Databases &quot;$(OutDir)\Databases&quot; /i /e /y /d" />
person mhenry1384    schedule 07.07.2017
comment
Не съм сигурен дали проблемът ви е решен сега, но за отстраняване на грешки в такива случаи задачата MSBuild Message е полезна: ‹Message Text=Build.ArtifactStagingDirectory=$(Build.ArtifactStagingDirectory) Importance=high/› По този начин виждате каква стойност има наистина е зададен вътре в csproj - person ackh; 09.07.2017