Преобразованию конфигурации Teambuild 2013 не удалось найти PublishDir

У меня есть решение VS 2010, которое использует преобразования конфигурации следующим образом:

<Target Name="AfterBuild">
<TransformXml Condition="'$(IsDesktopBuild)' == 'false'" Source="Web.config" Transform="$(ProjectConfigTransformFileName)" Destination="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.config" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Debug.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Release.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Something.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Else.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<AspNetCompiler Condition="('$(IsDesktopBuild)' != 'false') AND ('$(MvcBuildViews)'=='true')" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
<AspNetCompiler Condition="('$(IsDesktopBuild)' == 'false') AND ('$(MvcBuildViews)'=='true')" VirtualPath="temp" PhysicalPath="$(PublishDir)\_PublishedWebsites\$(ProjectName)" />
</Target>

Это в каждом проекте веб-сайта (.csproj) в.sln.

Когда я запускаю v 4.0 MSBuild с указанным параметром /p:PublishDir, все в порядке. Но когда я запускаю это как определение сборки с использованием шаблона по умолчанию (GitTemplate.xaml), папка по какой-то причине разрешается в $(ProjectDir), а не место публикации. поэтому цель преобразования пытается скопировать файлы в несуществующую папку ($(ProjectDir)\_PublishedWebsites\$(ProjectName)\Web.config).

Если я вручную укажу /p:PublishDir в STATIC месте на диске, сборка будет успешной. Как я могу сказать MSBuild, где на самом деле находится PublishDir?

Я счастлив редактировать рабочий процесс, чтобы назначить переменную или что-то, я просто не понимаю, как это возможно.

Я также попытался указать относительные пути (например, /p:PublishDir="..\..\bin\\") и переменные агента сборки команды (такие же, как мы настроили для путей сборки, например /p:PublishDir="D:\$(BuildAgentId)\$(BuildDefinitionId)\bin\\") безрезультатно - кажется, что переменные не развернуты и относительный путь не работает.

1 ответ

Решение

Добавьте что-то вроде этого перед целью AfterBuild:

<PropertyGroup>
    <PublishDir>PATH_TO_YOUR_PUBLISH_DIR</PublishDir>
</PropertyGroup>

Вы должны быть в состоянии использовать относительные пути без проблем:

<PropertyGroup>
    <PublishDir>..\..\bin\</PublishDir>
</PropertyGroup>

Помните, что путь будет относительно текущего файла проекта.

Если вы хотите переопределить его из командной строки, вы можете добавить условие вроде этого:

<PropertyGroup>
    <PublishDir Condition="'$(PublishDir)'==''">PATH_TO_YOUR_PUBLISH_DIR</PublishDir> <!-- This will be the default value -->
</PropertyGroup>

Затем вызовите MsBuild с параметром /p:PublishDir="Your_New_Path", чтобы переопределить значение по умолчанию.

Если у вас есть решение VS, вы можете использовать что-то вроде этого:

<PropertyGroup>
    <PublishDir Condition="'$(PublishDir)'==''">$(SolutionDir)PublishDir</PublishDir> <!-- This will be the default value -->
</PropertyGroup>

При этом будет использоваться каталог, в котором решение находится в качестве пользователя root, и будет создана папка "PublishDir".

Это будет работать, только если у вас есть решение, конечно, вы можете определить значение по умолчанию, если нет решения:

<PropertyGroup>
    <SolutionDir Condition="'$(SolutionDir)'=='' Or '$(SolutionDir)'=='*Undefined*'">Your_Default_SolutionDir</SolutionDir>
    <PublishDir Condition="'$(PublishDir)'==''">$(SolutionDir)PublishDir</PublishDir> <!-- This will be the default value -->
</PropertyGroup>
Другие вопросы по тегам