Репликация VS2008 «Опубликовать веб-сайт» из командной строки

Я пытаюсь воспроизвести точную функциональность этого диалога в Visual Studio 2008 в сценарии сборки: альтернативный текст

Это веб- сайт ASP.NET , а не веб- приложение .

Я прогуглил это и обнаружил немало вещей, связанных с MSBuild, но все это, похоже, касается решений, разработанных как веб-приложения ASP.NET:

http://www.driebier.net/post/Using-MSBuild-to-deploy-visual-studio-2005-web-applications.aspx http://blog.donnfelker.com/post/TFS-Build-Not-Publishing -Web-Applications.aspx

Эта статья, похоже, относится к веб-сайтам ASP.NET, но я обнаружил, что получаю сообщение об ошибке при попытке выполнить сборку с использованием этих предложений:

C: \ dev \ T & A> msbuild / t: _CopyWebApplication / свойство: OutDir = c: \ temp \ taweb \ / prope
RTY: WebProjectOutputDir = C: \ Temp \ taweb \

Microsoft (R) Build Engine Версия 3.5.30729.1
[Microsoft .NET Framework, версия 2.0.50727.3074]
Copyright (C) Microsoft Corporation 2007. Все права защищены.

Сборка началась 22.04.2009 11:50:42.
Проект "C: \ dev \ T & A \ TAWeb.sln" на узле 0 (цель (и) _CopyWebApplication).
  Построение конфигурации решения "Debug | .NET".
C: \ dev \ T & A \ TAWeb.sln: ошибка MSB4057: цель "_CopyWebApplication" не
 существуют в проекте.
Готовый строительный проект "C: \ dev \ T & A \ TAWeb.sln" (_CopyWebApplication target (s)) -
 НЕ СМОГЛИ.


Сборка не удалась.

"C: \ dev \ T & A \ TAWeb.sln" (цель _CopyWebApplication) (1) ->
  C: \ dev \ T & A \ TAWeb.sln: ошибка MSB4057: цель "_CopyWebApplication" не выполняет
не существует в проекте.

0 Предупреждение (я)

1 ошибка

Прошедшее время 00: 00: 00.06

Решение, которое я пытаюсь опубликовать (унаследовано, а не мое), не имеет файлов .csproj (куда я могу импортировать цель _CopyWebApplication из C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets)

Возможно, в этом отличие Visual Studio 2005/2008?

В любом случае, я чувствую, что иду по неверному пути.

По сути, мне просто нужно добиться именно того , что делает приведенный выше диалог, но из командной строки.

Огромное спасибо

22.04.2009 10:58:50
11 ОТВЕТОВ
РЕШЕНИЕ

Следующая команда дублирует диалоговое окно « Опубликовать веб-сайт » с настройками по умолчанию.

Команда для публикации веб-сайта с настройками по умолчанию

aspnet_compiler -nologo -v / -p "C:\WebSite1" -u "C:\TargetPath"

Ссылка

1) См. Содержимое сообщества под названием « Вы хотите опубликовать сайт, но у вас нет Visual Studio» ... по адресу http://msdn.microsoft.com/en-us/library/20yh9f1b(classic).aspx .

  • Microsoft Visual Studio 2005> Командная строка Visual Studio 2005
  • Microsoft Visual Studio 2008> Командная строка Visual Studio 2008
  • Microsoft .NET Framework SDK v2.0> Командная строка SDK

2) См. «Инструмент компиляции ASP.NET (Aspnet_compiler.exe)» по адресу http://msdn.microsoft.com/en-us/library/ms229863.aspx .

3) Следующая выдержка из пошагового руководства: Развертывание веб-приложения ASP.NET с использованием XCOPY по адресу http://msdn.microsoft.com/en-us/library/f735abw9.aspx

В качестве альтернативы использованию инструмента командной строки XCOPY, который поддерживается всеми версиями .NET Framework, вы можете использовать новый инструмент .NET Framework 2.0, расположенный по адресу% SystemRoot% \ Microsoft.NET \ Framework \ version 2 или более поздней версии. \ Aspnet_compiler.exe для компиляции и развертывания вашего веб-приложения. Для получения дополнительной информации см. Инструмент компиляции ASP.NET (Aspnet_compiler.exe) .

4) Следующая выдержка из инструкции Как прекомпилировать веб-сайты ASP.NET для развертывания по адресу http://msdn.microsoft.com/en-us/library/ms227976.aspx .

Если ваш веб-сайт не является приложением IIS и поэтому не имеет записи в метабазе IIS, используйте следующее значение для параметра -v.

aspnet_compiler -p physicalOrRelativePath -v / targetPath

В этом случае параметр PhysicalOrRelativePath ссылается на полный путь к каталогу, в котором находятся файлы веб-сайта, или путь относительно текущего каталога. Оператор period (.) Разрешен в параметре PhysicalOrRelativePath. Ключ -v указывает корень, который компилятор будет использовать для разрешения ссылок на корень приложения (например, с помощью оператора тильды (~)). Когда вы указываете значение / для параметра -v, компилятор разрешает пути, используя физический путь в качестве корневого.

38
29.10.2009 01:43:55
@AMissico, вам нужно вручную запустить команду aspnet_compiler? (Я буду голосовать за ваш ответ). Спасибо.
w0051977 6.03.2013 20:20:07

Лично я использую buildbot, который запускает команды для меня, мне пришлось создать сценарий VBS, который выполняет загрузку для меня.

Я установил WinSCP для работы с ftp, а затем просто загрузил сценарий:

Set WshShell = CreateObject("WScript.Shell")
sCmd1 = """C:\Program Files\WinSCP\winscp.com"" <myusername> /command ""option batch on"" ""option confirm off"" ""put " & DefaultPath & strResult & "\" & DefaultFileName & " /Usr/<myuser>/" & updateType & "/" & strResult & "/"" ""exit"""

Для предварительной компиляции сайта из командной строки я делаю следующее, однако делаю это на веб-сервере, а не перед его загрузкой:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -p "D:\<mycompany>\Backedup\Web Sites\<mysite\Root" -v /
4
23.04.2009 11:23:18
Мой вопрос касается предварительной компиляции веб-сайта ASP.NET перед его размещением на веб-сервере, а не перемещением файлов по сети.
tomfanning 22.04.2009 13:49:44
Я отредактировал свой ответ, чтобы помочь, это не правильный ответ, но может дать подсказку.
Phil Hannent 23.04.2009 11:24:30
Спасибо, я собираюсь вернуться к использованию aspnet_compiler напрямую на этой неделе. Я обновлю свой пост с моим опытом.
tomfanning 27.04.2009 08:52:52

В функции «Публикация ...» нет ничего волшебного, что вы не могли бы воссоздать самостоятельно, тем более что вы используете сетевой файловый ресурс.

По сути, все, что он делает, это копирует ваши файлы из одного места в другое. Используя NAnt, вы можете выполнить это с помощью задачи копирования или использовать задачу exec для вызова xcopy. Если вы используете инструмент сборки, отличный от NAnt, я уверен, что есть поддержка подобных задач.

Если вы хотите оставить исходный код и информацию отладки позади, вы можете исключить файлы, заканчивающиеся на .cs или .pdb. И NAnt copy, и xcopy предоставляют простые способы сделать это.

-1
22.04.2009 11:27:12
Функция публикации не просто копирует файлы, она предварительно компилирует веб-сайт ASP.NET, помещая весь код в файлы .DLL и помещая заполнители по всему результирующему дереву, где были бы страницы .aspx (содержащие разметку). Это бит, который я пытаюсь автоматизировать, а не бит "перемещения файлов". Дело в том, что я не хочу, чтобы веб-сервер компилировал исходный код.
tomfanning 22.04.2009 13:52:42
Да, мое недоразумение. Я думал, веб-приложение, а не веб-сайт.
Brad Tutterow 22.04.2009 22:34:30

Я думаю, что вы ищете задачу AspNetCompiler

<Target Name="PublishToIIS" DependsOnTargets="Publish">
    <AspNetCompiler    
            VirtualPath="$(IISVirtualPath)"
            TargetPath="$(IISTargetPath)"
            PhysicalPath="$(MSBuildProjectDirectory)/trunk/InternalAppCS/Web.UI/"
            Force="true"
            Debug="$(IISDebug)"
     />

</Target>
6
22.04.2009 11:35:13
Хммм, в конце концов все, кажется, ведет к aspnetcompiler - но я понимаю, что вам нужен целевой IIS с виртуальным каталогом для сайта, хотя это кажется немного двусмысленным. Я сделаю еще кое-что об этом позже.
tomfanning 22.04.2009 13:53:43
Вы можете опубликовать в любом удаленном каталоге без виртуального каталога. Я использую это для своих проектов MVC и просто устанавливаю TargetPath в общий каталог на веб-сервере.
Kristoffer L 16.09.2009 07:13:04

Я использовал msbuild именно для того, что вы описываете. Вы пытались установить свойство как это?

 /property:"OutDir=c:\temp\taweb\;WebProjectOutputDir=c:\temp\taweb\"

Если это все еще не работает, дайте мне знать, и я могу выслать вам мой bat-файл, который запускает скрипт msbuild, который получает svn, создает файл assembly.info, развертывает веб-сайт и, наконец, запускает http get на домашней странице сайта, просто чтобы убедиться, что он построен и правильно развернут.

Надеюсь, это поможет Rihan

4
29.04.2009 11:29:32

Добавьте в ваш файл .csproj:

<Target Name="AfterBuild">
<Message Text="Copying to Deployment Dir:" />
<Copy SourceFiles="@(Content)" DestinationFolder="..\PreCompiledWeb\%(Content.RelativeDir)" />
<CreateItem Include="$(OutputPath)\*">
    <Output TaskParameter="Include" ItemName="Binaries"/>
</CreateItem>
<Copy SourceFiles="@(Binaries)" DestinationFolder="..\PreCompiledWeb\bin" />

Измените «.. \ PreCompiledWeb» для папки, в которую вы хотите опубликовать, или вы можете указать переменную что-то вроде: $ (OutputFolder), которую вы можете передать

затем перейдите в папку вашего веб-приложения и выполните:

msbuild /t:Build

Затем вы можете скопировать эти файлы куда угодно, используя xcopy:

xcopy "..\PreCompiledWeb\*.*" "C:\MySite\" /e

Это должно сделать это.

5
10.09.2009 21:47:00
Такой красивый взломать :-) спасает мой вечер!
David Schmitt 12.09.2011 16:51:13

Эта «волшебная» комбинация делает то, что вы ищете. ) Потребовалось всего два дня, чтобы получить правильную комбинацию для моего проекта.) Ключ должен включать цель _CopyWebApplication и цель ResolveReferences.

msbuild "/t:_CopyWebApplication;ResolveReferences;publish" /p:OutDir="C:\inetpub\wwwroot\[appname]\bin\" /p:WebProjectOutputDir="C:\inetpub\wwwroot\[appname]" c:\directory\[appname].csproj    
6
23.08.2012 00:56:58
Извините за комментарий к 6-летнему посту, но, похоже, это относится к веб-приложениям, а не к веб-сайтам. Приложения веб-сайта Visual Studio не имеют файла .csproj.
tomfanning 8.08.2016 09:20:55

Полученная ошибка (C: \ dev \ T & A \ TAWeb.sln: ошибка MSB4057: цель "_CopyWebApplication" не существует в проекте) вызвана двумя проблемами. Во-первых: целевой _CopyWebApplication должен вызываться в файле проекта WebApplication, а не в качестве решения. Второе: на веб-сайте нет файла проекта, в веб-приложениях есть файлы проекта.

Цель _CopyWebApplication применяется только к публикации проекта WebApplication. Используйте задачу AspNetCompiler MSBuild необходимо использовать для публикации веб-сайта.

Когда вы публикуете веб-сайт в Visual Studio 2008, вторая строка выводится «Предварительная компиляция веб-сайта». Параметры Visual Studio отображаются для публикации карты веб-сайта непосредственно в параметрах AspNetCompiler и Aspnet_compiler.exe .

Хотя я здесь не первый, кто говорит «использовать AspNet_compiler», я решил описать причины, по которым это может быть полезно. Кстати, я думаю, что AspNet_compiler можно использовать для публикации веб-приложения, но мне нужно провести еще несколько тестов.

2
27.10.2010 17:26:10

Вот небольшой скрипт PowerShell, который создает решение, а затем публикует из него веб-проект.

MSBuild предназначен для .Net 3.5, поэтому при необходимости измените на «\ v4.0 \».

$build = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe"

$SolutionPath = "C:\Projects\AdminWebSite"
$SolutionFile = "AdminWebSite.sln"
$WebProjectFile = "Admin.Web\Admin.Web.csproj"
$OutputPath = "C:\PublishedSites\Hosts\adminweb"

& $build "$SolutionPath\$SolutionFile" /t:rebuild
& $build "$SolutionPath\$WebProjectFile" "/t:ResolveReferences;_CopyWebApplication;publish" /p:OutDir="$OutputPath\bin\" /p:WebProjectOutputDir="$OutputPath"

ResolveReferences должен предшествовать _CopyWebApplication, в противном случае зависимости пропадают.

Приведенные здесь примеры путей приведены для:

  • C: \ Project \ AdminWebSite \ AdminWebSite.sln
  • C: \ Project \ AdminWebSite \ Admin.Web \ Admin.Web.csproj
3
7.04.2011 13:32:27
Похоже, что это для веб-приложений ASP.NET, а не веб-сайтов ASP.NET. Различие заключается в том, что у проектов веб-сайтов нет файла проекта, а только файл решения. Вот почему этот вопрос хитрый. В любом случае, спасибо.
tomfanning 7.04.2011 22:15:28
IIRC, Visual Studio создает временный «фальшивый» файл решения при сборке / публикации csproj.
Iain Ballard 19.04.2011 11:08:28

Я использую файл bat с помощью msbuild.exe (.net 3.5, vs 2008) для «публикации» моего сайта (vbproj) в папке.

% msBuildDir% \ msbuild "D: \ Project1 \ Client \ WebPresentation \ ConsultaOperaciones.vbproj" / t: ResolveReferences; Перестроить / p: BuildingProject = true; OutDir = D: \ Instalaciones \ ultima \ PublicacionWeb \ OutDir \; WebProjectOutputir =; \ Instalaciones \ Ultima \ PublicacionWeb \ WebProjectDir \

1
20.07.2011 18:16:55

Я боролся с той же ошибкой (MSB4057: цель "_CopyWebApplication" не существует в проекте.

Да. Я использовал проект веб-приложения (не веб-сайт).

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

Один проект (который работал) был создан с использованием более новой версии Visual Studio. Другой (который НЕ работал) был создан много лет назад и был обновлен за последние годы до текущей версии, с которой я работаю. Обновленный проект, очевидно, не был обновлен с новыми целями сборки, так как стали доступны более новые версии Visual Studio.

В нижней части файла проекта, который работал, я нашел следующее:

<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\WebApplications\Microsoft.WebApplication.targets" />

Вторая строка импорта НЕ была в проекте, что вызывало проблемы.

Я просто скопировал импорт из рабочего файла и вставил его в относительное место в нерабочем файле, и альт!

Хотя это не является прямым решением первоначальной проблемы, определенной в этой теме, я надеюсь, что это поможет другим людям, которые наткнулись на эту тему, ища похожие проблемы только с реальными проектами веб-приложений.

4
20.09.2011 00:59:13