MSBuild 2010 - как опубликовать веб-приложение в определенном месте (нант)?

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

Например: если я скажу ему опубликовать в C:\dev\build\Output\Debug, тогда фактические веб-файлы окажутся в C:\dev\build\Output\Debug\Archive\Content\C_C\code\app\Source\ControllersViews\obj\Debug\Package\PackageTmp И C_C часть пути изменится (не знаю, как он выбирает эту часть пути).

Это означает, что я не могу просто создать сценарий для копии из места публикации.

Сейчас я использую эту команду nant / msbuild:

  <target name="compile" description="Compiles">
<msbuild project="${name}.sln">

  <property name="Platform" value="Any CPU"/>
  <property name="Configuration" value="Debug"/>
  <property name="DeployOnBuild" value="true"/>
  <property name="DeployTarget" value="Package"/>
  <property name="PackageLocation" value="C:\dev\build\Output\Debug\"/>
  <property name="AutoParameterizationWebConfigConnectionStrings" value="false"/>
  <property name="PackageAsSingleFile" value="false"/>

</msbuild>

Any ideas on how to get it to send the web files directly to a specific location?


person Mr. Flibble    schedule 28.05.2010    source источник


Ответы (3)


msbuild /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Release;_PackageTempDir=C:\temp\somelocation;AutoParameterizationWebConfigConnectionStrings=false MyProject.csproj

Соответствующий скрипт NAnt:

<msbuild project="MyProject.csproj" target="PipelinePreDeployCopyAllFilesToOneFolder">
  <property name="Configuration" value="Release" />
  <property name="_PackageTempDir" value="C:\temp\somelocation" />
  <property name="AutoParameterizationWebConfigConnectionStrings" value="false" />
</msbuild>

использованная литература

См. Также Групповая сборка: локальная публикация с помощью MSDeploy

person Pavel Chuchuva    schedule 09.08.2010

Если вы используете веб-приложение VS2010 (в отличие от проекта веб-сайта), подумайте о настройке параметров «Пакет / публикация веб-сайтов» в своем проекте и создании цели «Проект» в своем сценарии nant.

Здесь много интересного и полезного опыта msdeploy: http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsingXCopyYoureDoingItWrong.aspx

В своих сценариях nant я запускаю следующие команды msbuild:

    <if  test="${property::exists('basename')}">
        <exec program="${msbuild.location}" workingdir="${project::get-base-directory()}">
            <arg value="/p:Configuration=${configuration}" />
            <arg value="/logger:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,${msbuild.logger.dll}" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="/noconsolelogger" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="${basename}.sln"/>
        </exec>
    </if>

...

    <if  test="${property::exists('basename')}">
        <exec program="${msbuild.location}" workingdir="${project::get-base-directory()}\${basename}">
            <arg value="/p:Configuration=${configuration}" />
            <arg value="/t:Package" />
            <arg value="/logger:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,${msbuild.logger.dll}" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="/noconsolelogger" if="${nunit.formatter.type == 'Xml'}"/>
            <arg value="${basename}.csproj"/>
        </exec>
    </if>

Моя переменная basename nant дает имя как файла решения VS (.sln), так и файла проекта (.csproj) для веб-приложения. Я предпочитаю развертывание zip-файла, как показано в настройках моего проекта:

Пример настроек пакета для развертывания веб-приложения

Есть еще одна причуда. Если вы устанавливаете MSDeploy версии 2.0 на целевой компьютер, файл .deploy.cmd необходимо отредактировать, чтобы изменить номер версии MSDeploy следующим образом:

Изменять

  for /F "usebackq tokens=2*" %%i  in (`reg query "HKLM\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1" /v InstallPath`) do (

To

  for /F "usebackq tokens=2*" %%i  in (`reg query "HKLM\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\2" /v InstallPath`) do (
person randomfactor    schedule 13.04.2011

Я думаю, вы используете неправильное свойство. Вместо этого попробуйте свойство OutDir.

<arg value="/property:OutDir=C:\dev\build\Output\Debug\" />

Лично я вызываю MsBuild.exe напрямую вместо использования тега msbuild:

    <exec program="${MSBuildPath}">
        <arg line='"${ProjectFile}"' />
        <arg value="/target:_CopyWebApplication" />
        <arg value="/property:OutDir=${LocalDeployPath}\" />
        <arg value="/property:WebProjectOutputDir=${LocalDeployPath}" />
        <arg value="/property:Configuration=${SolutionConfiguration}" />
        <arg value="/verbosity:normal" />
        <arg value="/nologo" />
    </exec>

MSBuildPath - путь к MsBuild.exe (позволяет настроить таргетинг на любую версию фреймворка).

ProjectFile - относительный путь к файлу вашего проекта.

LocalDeployPath - локальная папка, в которую все будет выведено. Ваш сценарий копирования также будет использовать его в качестве исходного каталога.

SolutionConfiguration - выпуск, отладка

person Babak Naffas    schedule 30.06.2010
comment
_CopyWebApplication не будет работать, если вы используете Nuget в справочной библиотеке. - person Russel Yang; 01.04.2011
comment
Да, свойство OutDir точно контролирует его, плюс-минус подкаталог _PublishedWebsites \ $ (ProjectName) \ - person Chris F Carroll; 30.05.2019