MSDeploy не принимает динамический путь для места назначения развертывания

Мы используем MSDeploy с проектом веб-развертывания для развертывания нашего проекта веб-сайта с использованием сборок TFS (TFS 2010 и VS 2010).

TFS Build отправляет созданные файлы в подпапку указанной перетаскиваемой папки, поэтому, если я укажу перетаскиваемую папку как:

\\ machineName \ Builds

Проект сборки помещается в:

\\ MachineName \ Builds \ 1. Тест \ 20120226.38 \ Развернуть

В этом примере «1. Test» - это имя определения сборки TFS, «20120226.38» - отметка даты и номер сборки, а «Deploy» - это имя проекта веб-развертывания.

Когда я создаю свою группу элементов DeploySource в файле Deploy.wdproj и указываю точный путь к источнику MSDeploy (см. Непосредственно ниже), все в порядке. Пример:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Test|AnyCPU' ">
    <DeploySource Include="DirPath">
        <Path>C:\Builds\1. Test\20120226.39\_PublishedWebsites\Deploy</Path>
        <ComputerName>machineName</ComputerName>
        <UserName>$(UserName)</UserName>
        <Password>$(Password)</Password>
    </DeploySource>
</ItemGroup>

Чтобы учесть изменение номера сборки и даты, я добавил переменную $ (BuildNumber) через файл DefaultTemplate.xaml. Итак, вот немного измененный пример:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Test|AnyCPU' ">
    <DeploySource Include="DirPath">
        <Path>C:\Builds\1. Test\$(BuildNumber)\_PublishedWebsites\Deploy</Path>
        <ComputerName>machineName</ComputerName>
        <UserName>$(UserName)</UserName>
        <Password>$(Password)</Password>
    </DeploySource>
</ItemGroup>

И они передаются в этот вызов MSDeploy:

<MSDeploy  Condition=" '$(Configuration)|$(Platform)' == 'Test|AnyCPU' "
    Whatif="$(WhatIf)"
    Verb="sync"
    Source="@(DeploySource)"
    Destination="@(DeployDest0)"
    ExePath="$(MSDeployPath)"
/>

Вот моя проблема:

В примере 1 выше все в порядке, и сайт сборки развертывается в правильном месте.

В примере 2 выше я получаю следующую ошибку:

MSDEPLOY: Object of type 'dirPath' and path '\\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy' cannot be created.
MSDEPLOY: (2/27/2012 6:54:14 PM) An error occurred when the request was processed on the remote computer.
MSDEPLOY: Object of type 'dirPath' and path '\\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy' cannot be created.
MSDEPLOY: Could not find directory '\\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy'.
MSDEPLOY: Could not find a part of the path '\\?\UNC\machineName\Builds\1. Test\20120227.2\_PublishedWebsites\Deploy'.

Проверить и вручную изменить номер сборки нереально. Я чувствую, что мне здесь не хватает чего-то простого, но я не могу понять это.

Примечание. Это проект веб-сайта, а не проект веб-приложения. Ограничения по времени и зависимость от поставщиков «черного ящика» не позволяют выполнить преобразование.


person Joisey Mike    schedule 27.02.2012    source источник
comment
Вопрос: В вашем рабочем примере, где вы жестко запрограммировали номер сборки, это уже существующая сборка, в которой папка существовала до вашего вызова команды? Если это так, то я предполагаю, что проблема, скорее всего, связана с порядком операций, то есть папка, указанная вами с помощью $ (BuildNumber), не существует, когда путь оценивается и запускается MSDeploy, а вместо этого создается позже в процесс сборки.   -  person Nick Nieslanik    schedule 28.02.2012
comment
Я пробовал это как с уже существующими путями, так и с новым путем, который будет создаваться при сборке. К сожалению, в обоих случаях результаты одинаковые.   -  person Joisey Mike    schedule 28.02.2012
comment
Вы пробовали использовать $ (OutDir), как подсказывает мой ответ?   -  person Nick Nieslanik    schedule 28.02.2012


Ответы (1)


Если в вашем рабочем примере, где вы жестко запрограммировали номер сборки, выходная папка сборки существовала до вашего вызова команды, тогда я бы предположил, что проблема, скорее всего, заключается в порядке операций, то есть в папке, которую вы указали с помощью $ (BuildNumber) не существует, когда путь оценивается и запускается MSDeploy, а вместо этого создается позже в процессе сборки.
На самом деле, я готов поспорить, вам нужно использовать другую переменную TFS для указания местоположения сборки как

 $(OutDir)\_PublishedWebsites\Deploy
person Nick Nieslanik    schedule 28.02.2012
comment
Я чувствую себя глупо, я только что понял, что OutDir позволит мне выполнить развертывание с сервера сборки, а не из места перетаскивания. Я не могу выполнить развертывание из места перетаскивания, если у меня нет XAML-файла (я думаю). Если я выберу правильный путь, он должен сработать. Возможно, мне просто нужно будет поиграть с путями, прежде чем я помечу это как ответ. Спасибо, Ник! - person Joisey Mike; 29.02.2012
comment
честно говоря, я удивлен, что $ (OutDir) не сработал, так как я считаю, что это не то же самое, что и место окончательной копии. TFS2010 использует рабочий процесс для выполнения задач до и после сборки, поэтому копирование в общую папку drop происходит в CodeActivity после завершения MSBuild. Другой вариант - использовать $ (BinariesRoot) (ознакомьтесь с этой статьей MSDN о свойствах сборки TFS msdn.microsoft.com/en-us/library/aa337598.aspx) - person Nick Nieslanik; 29.02.2012
comment
Еще раз спасибо, Ник, я устранил все неровности. - person Joisey Mike; 29.02.2012
comment
Только что видел ваш последний ответ, честно говоря, я удивлен ..., я просто хочу уточнить, что $ (OutDir) в конечном итоге отлично поработал для меня. - person Joisey Mike; 29.02.2012
comment
классно. очевидно, мы отправили сообщения в одно и то же время :) - person Nick Nieslanik; 29.02.2012