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

Posted

技术标签:

【中文标题】从命令行复制 VS2008“发布网站”【英文标题】:Replicate VS2008 "Publish Web Site" from command line 【发布时间】:2009-04-22 10:58:50 【问题描述】:

我正在尝试在构建脚本中复制 Visual Studio 2008 中此对话的确切功能:

这是一个 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) 构建引擎版本 3.5.30729.1 [Microsoft .NET 框架,版本 2.0.50727.3074] 版权所有 (C) Microsoft Corporation 2007。保留所有权利。 构建开始于 22/04/2009 11:50:42。 节点 0(_CopyWebApplication 目标)上的项目“C:\dev\T&A\TAWeb.sln”。 构建解决方案配置“Debug|.NET”。 C:\dev\T&A\TAWeb.sln : 错误 MSB4057: 目标“_CopyWebApplication”不 存在于项目中。 完成构建项目“C:\dev\T&A\TAWeb.sln”(_CopyWebApplication 目标)- 失败的。 构建失败。 "C:\dev\T&A\TAWeb.sln" (_CopyWebApplication 目标) (1) -> C:\dev\T&A\TAWeb.sln : 错误 MSB4057: 目标“_CopyWebApplication”没有 项目中不存在。 0 个警告 1 个错误 经过时间 00:00:00.06

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

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

反正我觉得我走错了路。

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

非常感谢

【问题讨论】:

【参考方案1】:

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

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

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

参考

1) 在http://msdn.microsoft.com/en-us/library/20yh9f1b(classic).aspx 上查看标题为您想要发布一个网站但您还没有 Visual Studio 的社区内容...

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 应用程序http://msdn.microsoft.com/en-us/library/f735abw9.aspx

作为使用 XCOPY 的替代方法 支持的命令行工具 通过所有版本的 .NET Framework, 您可以使用新的 .NET Framework 2.0 工具位于 %SystemRoot%\Microsoft.NET\Framework\版本 2 或更高版本\Aspnet_compiler.exe 到 编译和部署您的 Web 应用。如需更多信息,请参阅ASP.NET Compilation Tool (Aspnet_compiler.exe)。

4) 以下摘自 如何:预编译 ASP.NET 网站以进行部署http://msdn.microsoft.com/en-us/library/ms227976.aspx。

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

aspnet_compiler -p physicalOrRelativePath -v / targetPath

在这种情况下, 物理或相对路径参数 指完全合格的 网站所在的目录路径 文件所在的位置,或相对路径 到当前目录。时期 (.) 运算符允许在 物理或相对路径参数。这 -v 开关指定编译器将用来解析的根 应用程序根引用(对于 例如,使用波浪号 (~) 运算符)。 当您指定 / 的值时 -v 开关编译器将 使用物理解析路径 路径为根。

【讨论】:

@AMissico,你必须手动运行 aspnet_compiler 命令吗? (我会赞成你的回答)。谢谢。【参考方案2】:

我认为您正在寻找AspNetCompiler 任务

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

</Target>

【讨论】:

嗯,一切似乎最终都回到了 aspnetcompiler - 但我的理解是,您需要一个带有站点虚拟目录的目标 IIS,尽管这似乎有点模棱两可。稍后我将对此进行更多挖掘。 您可以发布到任何没有虚拟目录的远程目录。我将它用于我的 MVC 项目,并将 TargetPath 设置为 Web 服务器上的共享目录。【参考方案3】:

这种“神奇”组合可以满足您的需求。 )只花了两天时间就为我的项目找到了正确的组合。)关键是包含 _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 年前的帖子,但这似乎与 Web 应用程序有关,而不是与网站有关。 Visual Studio 网站应用程序没有 .csproj 文件。【参考方案4】:

添加到您的 .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

应该可以的。

【讨论】:

这么漂亮的 hack :-) 拯救了我的夜晚!【参考方案5】:

我个人使用为我运行命令的 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 /

【讨论】:

我的问题是关于在将 ASP.NET 网站放到 Web 服务器之前预编译它,而不是在网络上移动文件。 我编辑了我的答案以提供帮助,它不是正确的答案,但可能会提供提示。 谢谢,我打算在这周的某个时候直接使用 aspnet_compiler 重新访问。我会用我的经验更新我的帖子。【参考方案6】:

我一直在使用 msbuild 来满足您的描述。您是否尝试过这样设置属性?

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

如果还是不行,请告诉我,我可以把我的 bat 文件发给你站点主页上的 http 获取,只是为了确保它正确构建和部署。

希望对你有帮助 日韩

【讨论】:

【参考方案7】:

我遇到了同样的错误(MSB4057:项目中不存在目标“_CopyWebApplication”。

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

我很困惑,因为我有一个项目成功了,一个没有。因此,我与 ExamDiffPro 坐下来,开始比较项目文件。我发现项目文件底部包含的构建目标部分不同。

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

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

&lt;Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" /&gt;

&lt;Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\WebApplications\Microsoft.WebApplication.targets" /&gt;

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

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

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

【讨论】:

【参考方案8】:

这是一个 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:\Project\AdminWebSite\AdminWebSite.sln C:\Project\AdminWebSite\Admin.Web\Admin.Web.csproj

【讨论】:

似乎这是针对 ASP.NET Web 应用程序,而不是 ASP.NET 网站。区别在于网站项目没有项目文件,只有解决方案文件。这就是为什么这个问题很棘手。不过还是谢谢。 IIRC,Visual Studio 在构建/发布 csproj 时会创建一个临时的“假”解决方案文件。【参考方案9】:

您收到的错误(C:\dev\T&A\TAWeb.sln : error MSB4057: The target "_CopyWebApplication" does not exist in the project)是由于两个问题。首先:目标 _CopyWebApplication 必须在 WebApplication 项目文件上调用,而不是解决方案。第二:网站没有项目文件,WebApplications有项目文件。

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

当您在 Visual Studio 2008 中发布网站时,输出的第二行是“预编译网站”。 Visual Studio 显示的选项用于将网站地图直接发布到AspNetCompiler 和Aspnet_compiler.exe 的选项。

虽然我不是第一个在这里说“使用 AspNet_compiler”的人,但我认为描述原因可能会有所帮助。附带说明一下,我认为 AspNet_compiler 可用于发布 webapp,但我需要进行更多测试。

【讨论】:

【参考方案10】:

我使用 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\;WebProjectOutputDir=D:\Instalaciones\ultima\PublicacionWeb\WebProjectDir\

【讨论】:

【参考方案11】:

您无法自行重新创建“发布...”功能并没有什么神奇之处,尤其是当您以网络文件共享为目标时。

它的核心是把你的文件从一个地方复制到另一个地方。使用 NAnt,您可以使用 copy 任务完成此任务,或者您可以使用 exec 任务调用 xcopy 如果您使用的是 NAnt 以外的构建工具,我相信有类似任务的支持.

如果您想保留原始代码和调试信息,可以排除以 .cs 或 .pdb 结尾的文件。 NAnt copy 和 xcopy 都提供了简单的方法来做到这一点。

【讨论】:

发布功能不只是复制文件,它预编译 ASP.NET 网站,将所有代码放在 .DLL 中,并将占位符放置在 .aspx 页面所在的生成树上(包含标记)本来是。这是我试图自动化的部分,而不是“移动文件”部分。这里的重点是我不希望 Web 服务器编译源代码。 是的,我的误解。我在考虑 Web 应用程序,而不是网站。

以上是关于从命令行复制 VS2008“发布网站”的主要内容,如果未能解决你的问题,请参考以下文章

vs2005 开发的WEB项目如何发布到IIS上

VS2008中命令行参数如何设置读入多个文件

VS发布网站时,报错提示:“未能将文件xxx复制到xxx,未能找到文件xx”三种解决方案!

VS发布网站时,报错提示:“未能将文件xxx复制到xxx,未能找到文件xx”三种解决方案!

如何使用命令行msbuild部署VS2012网站项目而不进行预编译?

尝试从 VS 2012 发布网站时导致 NormalizeServiceUrl 和 Missing 或 Invalid 属性错误的原因