2014-12-09 8 views
0

У меня есть решение VS 2010, который использует конфигурационный преобразуется как так:Teambuild 2013 конфиг преобразования не в состоянии найти PublishDir

<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 с/р: PublishDir = «Your_New_Path», чтобы переопределить значение по умолчанию.

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

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

Это будет использовать каталог, в котором раствор помещается в корень и создать папку «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> 
+0

спасибо так много :) – zaitsman