从命令行复制VS2008“发布网站”

时间:2009-04-22 10:58:51

标签: asp.net visual-studio-2008 msbuild publish

我试图在构建脚本中复制Visual Studio 2008中此对话框的确切功能: alt text

这是一个ASP.NET网站网站,而非网络应用

我已经用Google搜索了这个并且发现了很多涉及MSBuild的内容,但这一切似乎都与ASP.NET Web应用程序中的解决方案有关:

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

This article似乎与ASP.NET网站相关,但我发现在尝试使用这些建议进行构建时出现错误:

C:\dev\T&A>msbuild /t:_CopyWebApplication /property:OutDir=c:\temp\taweb\ /prope
rty:WebProjectOutputDir=c:\temp\taweb\

Microsoft (R) Build Engine Version 3.5.30729.1
[Microsoft .NET Framework, Version 2.0.50727.3074]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 22/04/2009 11:50:42.
Project "C:\dev\T&A\TAWeb.sln" on node 0 (_CopyWebApplication target(s)).
  Building solution configuration "Debug|.NET".
C:\dev\T&A\TAWeb.sln : error MSB4057: The target "_CopyWebApplication" does not
 exist in the project.
Done Building Project "C:\dev\T&A\TAWeb.sln" (_CopyWebApplication target(s)) --
 FAILED.


Build FAILED.

"C:\dev\T&A\TAWeb.sln" (_CopyWebApplication target) (1) ->
  C:\dev\T&A\TAWeb.sln : error MSB4057: The target "_CopyWebApplication" does n
ot exist in the project.

0 Warning(s)

1 Error(s)

Time Elapsed 00:00:00.06

我正在尝试发布的解决方案(继承,而不是我自己)没有.csproj文件(我可以从C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v9导入_CopyWebApplication目标) 0.0 \ web应用\ Microsoft.WebApplication.targets)

也许这是Visual Studio 2005/2008的差异?

无论如何,我觉得我在那里走错了路。

基本上我只需要实现完全上述对话的功能,但是从命令行开始。

非常感谢

11 个答案:

答案 0 :(得分:38)

以下命令使用默认设置复制发布网站对话框。

使用默认设置发布网站的命令

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)请参阅http://msdn.microsoft.com/en-us/library/ms229863.aspx上的“ASP.NET编译工具(Aspnet_compiler.exe)”。

3)摘自演练:使用XCOPY 部署ASP.NET Web应用程序<{3}}

  

作为使用XCOPY的替代方案   命令行工具,受支持   所有版本的.NET Framework,   您可以使用新的.NET Framework 2.0   工具位于   %SYSTEMROOT%\ Microsoft.NET \框架\ 版本   2或更高版本 \ Aspnet_compiler.exe到   编译和部署您的Web   应用。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/f735abw9.aspx

4)摘录自如何:预编译ASP.NET网站以进行部署 ASP.NET Compilation Tool (Aspnet_compiler.exe)

  

如果您的网站不是互联网   信息服务(IIS)应用程序   因此在IIS中没有条目   配置数据库,使用以下值   -v开关。

     

aspnet_compiler -p physicalOrRelativePath -v / targetPath

     

在这种情况下,   physicalOrRelativePath参数   是指完全合格的   网站的目录路径   找到文件,或相对路径   到当前目录。时期   (。)运算符是允许的   physicalOrRelativePath参数。该   -v switch指定编译器将用于解析的根   应用程序根引用(for   例如,使用波浪号(〜)运算符)。   指定/的值时   -v切换编译器会   使用物理解析路径   路径作为根。

答案 1 :(得分:6)

我认为您正在寻找AspNetCompiler任务

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

</Target>

答案 2 :(得分:6)

这种“神奇”组合可以满足您的需求。 )我的项目只需要两天的时间来获得正确的组合。)关键是要包含_CopyWebApplication目标和ResolveReferences目标。

msbuild "/t:_CopyWebApplication;ResolveReferences;publish" /p:OutDir="C:\inetpub\wwwroot\[appname]\bin\" /p:WebProjectOutputDir="C:\inetpub\wwwroot\[appname]" c:\directory\[appname].csproj    

答案 3 :(得分:5)

添加到.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),您可以传递

然后转到web应用程序的文件夹并执行:

msbuild /t:Build

然后您可以使用xcopy将这些文件复制到任何地方:

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

应该这样做。

答案 4 :(得分:4)

我个人使用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"""

要从命令行预编译网站,我会执行以下操作,但是我在Web服务器上执行此操作,而不是在上载之前执行此操作:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -p "D:\<mycompany>\Backedup\Web Sites\<mysite\Root" -v /

答案 5 :(得分:4)

我一直在使用msbuild来完全按照你的描述。你试过设置这样的属性吗?

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

如果它仍然不起作用,请告诉我,我可以发送我的bat文件,msbuild脚本,svn get,构建assembly.info文件,部署网站,最后运行一个http get在网站主页上,只是为了确保它正确构建和部署。

希望它有所帮助 Rihan

答案 6 :(得分:4)

我正在努力解决同样的错误(MSB4057:项目中不存在目标“_CopyWebApplication”。

是。我使用的是Web应用程序项目(不是网站)。

我感到困惑,因为我有一个有效的项目,有一个没有。所以我和ExamDiffPro坐下来比较项目文件。我发现的是构建目标的部分包含在项目底部的文件是不同的。

使用较新版本的Visual Studio创建了一个项目(正在运行)。另一个(那是不工作的)是多年前创建的,并且多年来已经升级到我正在使用的当前版本。升级后的项目显然没有随着新版本的Visual Studio升级而升级。

在正在运行的项目文件的底部,我发现了以下内容:

  

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

     

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

第二个导入行不在导致问题的项目中。

我只是从工作文件中复制了导入,并将其粘贴到非工作文件中的相对位置,并且中提琴!

虽然这不是这个线程中定义的初始问题的直接解决方案,但我希望这可以帮助其他一些人偶然发现这个线程,寻找类似的问题,只有实际的Web应用程序项目。

答案 7 :(得分:3)

这是一个构建解决方案的小型PowerShell脚本,然后从中发布一个Web项目。

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:\项目\ AdminWebSite \ AdminWebSite.sln
  • C:\项目\ AdminWebSite \ Admin.Web \ Admin.Web.csproj

答案 8 :(得分:2)

您收到的错误(C:\ dev \ T&amp; A \ TAWeb.sln:错误MSB4057:项目中不存在目标“_CopyWebApplication”)是由于两个问题。第一:必须在WebApplication项目文件上调用目标_CopyWebApplication,而不是解决方案。第二:网站没有项目文件,WebApplications有项目文件。

_CopyWebApplication目标仅适用于发布WebApplication项目。 使用AspNetCompiler必须使用MSBuild任务来发布网站。

在visual studio 2008中发布网站时,第二行输出是“预编译网站”。视觉工作室选项显示用于直接将网站地图发布到AspNetCompilerAspnet_compiler.exe的选项。

虽然我不是第一个说“使用AspNet_compiler”的人,但我想过要找出可能有用的原因。另外,我认为AspNet_compiler可用于发布webapp,但我需要做更多的测试。

答案 9 :(得分:1)

我使用msbuild.exe(.net 3.5,vs 2008)将bat文件“发布”到我的网站(vbproj)文件夹中。

  

%msBuildDir%\的msbuild   “d:\ PROJECT1 \客户端\ WebPresentation \ ConsultaOperaciones.vbproj”   /吨:ResolveReferences;重建   / P:BuildingProject = TRUE; OUTDIR = d:\ INSTALACIONES \ ULTIMA \ PublicacionWeb \ OUTDIR \; WebProjectOutputDir = d:\ INSTALACIONES \ ULTIMA \ PublicacionWeb \ WebProjectDir \

答案 10 :(得分:-1)

“发布...”功能没有任何神奇之处,您无法自行重新创建,尤其是在您定位网络文件共享时。

在它的核心,它所做的只是将文件从一个地方复制到另一个地方。使用NAnt,您可以使用copy任务启用此功能,或者您可以使用exec任务调用xcopy如果您使用的是NAnt以外的构建工具,我确定支持类似的任务。

如果要保留原始代码和调试信息,可以排除以.cs或.pdb结尾的文件。 NAnt拷贝和xcopy都提供了简单的方法。