65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 发布插件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (7投票s)

2006年10月11日

CPOL

10分钟阅读

viewsIcon

72731

downloadIcon

380

集成源代码管理的发布插件。

引言

MyPublisher 是一个发布插件,它将源代码管理和 Web 部署项目集成到一个统一的发布解决方案中。它还允许对已发布的网站进行文件级别的控制。本文将介绍现有的 Visual Studio 发布机制及其不足之处。然后,将详细介绍 MyPublisher 项目的目标以及这些目标的实现方式。

发布网站

除非您是业余爱好者或非常小的公司,否则您很可能有一个正式的发布流程。将网站推送到生产服务器与推送到暂存服务器会有所不同,并且会涉及使用某种源代码管理系统。流程大致如下...

暂存环境

  1. 保存
  2. 从源代码管理获取最新版本
  3. 重新生成
  4. 如果没有错误,则签入并标记为候选发布 1
  5. 将网站推送到暂存服务器进行测试(自动化或手动)

生产环境

  1. 保存
  2. 获取已通过测试的标签
  3. 重新生成
  4. 如果没有错误,则标记为最终版(不应有任何文件被签出)
  5. 将网站推送到生产环境

最大的区别在于,在推送到生产环境时,您应该获取已通过测试的标签。如果您在各种产品之间使用通用组件(您应该这样做),那么您必须确保最终发布到生产环境的版本是经过测试的版本。这将消除发布不兼容代码的风险。

Visual Studio 2005 发布

ASP.NET 开发人员对 Visual Studio 的最大抱怨之一是发布选项的缺乏。表面上看,Visual Studio 提供了两种发布方式:“复制 Web”和“发布”。

“复制 Web”功能本质上与 FTP 发布工具相同。仅当您的网站的后台代码位于 app_code 文件夹中时才有用。虽然这有其适用场景,但大多数 Web 管理员不太愿意在生产服务器上放置源代码。

“发布”功能显然更有用,因为它会生成网站的 DLL 并通过 FrontPage、FTP 或文件共享发布已生成的构建。然而,这并非没有问题。首先,如果在本地,它就会被发布。同样,它会根据您的本地环境从头开始完全重新构建目标网站。因此,如果用户在生产站点上上传了文件,然后您发布了本地版本,您就会丢失所有用户上传的文件。唯一的解决方法是将您不想发布的文件夹在本地 IIS 中设置为子 Web,并将您不想覆盖的文件夹在目标服务器上设置为子 Web。这样,VS 的发布器就会识别它们是独立的、独占的网站,并且不会发布它们。但是,如果您本地某个文件夹中存在您不想在将要发布的文件夹中发布的文件,那么您就无能为力了。此外,您无法控制 Visual Studio 如何生成 DLL。它会将您的代码分散到多个 DLL 中,并将这些 DLL 发布到网站的 bin 目录。

Web 部署项目在很大程度上解决了这些问题,因为它们可以根据您从漂亮的 UI 界面或 XML MSBuild 文件中选择的各种选项来构建您的网站。但是,它仅仅构建站点而不进行部署。此外,它没有与源代码管理的集成;特别是标记您的发布版本,并确保始终发布最新代码或特定标签的代码。所有这些都可以通过 Source Safe 客户端完成。但是,它并没有集成到发布过程中。

MyPublisher 的目标

这个插件的目的是为开发人员提供一种简单的发布网站的方式,自动化源代码管理标记和文件获取,同时为开发人员提供对发布内容的低级别控制。这是通过与 Source Safe 集成并使用 Web 部署项目来实现的。此外,每个目录都会添加一个控制 XML 文件,允许开发人员阻止发布目录中的特定文件或整个目录。另外,MyPublisher 不应删除目标 Web 中的文件,除非开发人员指示这样做。这将允许用户上传文件,而无需为此创建虚拟目录。

Web 部署项目

让我花点时间谈谈 Web 部署项目 (WDP)。您可以从 MSDN 了解很多关于 WDP 的信息,所以我不在此赘述,但我会给您一些使用它们的建议。可以通过右键单击网站并选择“Web Deployment Project”来创建 Web 部署项目:到目前为止一切顺利。要让 MyPublisher 找到它们,您必须将它们放在解决方案的 *.sln 文件之外的 Build 文件夹中。这是因为 EnvDTE 对象无法知道它们的位置,因为项目的 Filename 属性会引发错误(非常令人沮丧)。我构建所有的网站都是作为 IIS 中的实际网站,而不是在文件系统中。对于这种设置,您需要确保在编译选项卡上选中“Use IIS Metabase for Source Inputs”,以便部署项目知道您没有使用文件系统。同样,您需要确保不要选中部署选项卡上的“Create an IIS virtual directory for the output folder”,或者如果选中了,请确保不要选择您的开发虚拟目录,因为您会覆盖您的开发目录,从而造成混乱。

Source Safe 集成

通过使用互操作性,您可以通过引用 Microsoft.VisualStudio.SourceSafe.Interop DLL 来集成到 Visual Source Safe 中。我看到开发人员犯的一个最大错误是让用户输入 srcsafe.ini 文件的路径。有些解决方案会解析项目文件本身,只要您处理的不是 Web 项目,这就可以工作。但这完全没有必要,因为这些信息可以从项目文件本身获得,尽管查找起来有点棘手。

我实现了一个 VSS 和 Team 都可以使用的通用接口(Team 尚处于开发阶段)。您从项目中获取绑定,然后将它们传递给构造函数。

SourceControl2 sc = (SourceControl2)DTE.SourceControl;
            
SourceControlBindings d = sc.GetBindings(proj.FileName);
switch (d.ProviderName)
{
    case "MSSCCI:Microsoft Visual SourceSafe":
        return (ISourceControl)new SourceSafe(d);
        break;
    default:
        return (ISourceControl)new VSTS(d);
}

这是 SourceSafe 对象的构造函数...

public SourceSafe(SourceControlBindings Bindings)
{
    DirectoryInfo di = new DirectoryInfo(Bindings.ServerName);
    msFileName = Bindings.ServerBinding.Split(',')[0];
    msFileName = msFileName.Substring(msFileName.IndexOf("$"));
    msFileName = msFileName.Split('\"')[0];
    vssDB.Open(di.FullName + "file://srcsafe.ini/", Environment.UserName, string.Empty);
   
}

对象的其余部分相当直接。需要注意的是,我们的 SourceSafe 登录名就是我们的用户名,并且我们没有为它们设置密码。主要原因是,如果某个开发人员休假了,签出了代码,而我们出于某种原因需要进行推送,我们可以撤销签出并更改文件,然后稍后合并版本。如果您没有这样做,那么您应该考虑为 SourceSafe 创建 UID 和密码设置。虽然我还没有尝试过,但 Team 实际上看起来要简单得多,因为它基本上是通过 Web 服务进行的远程过程调用列表。

出版

基本上,发布是将您的构建输出从源计算机移动到目标计算机的工具。通常,有三种方法可以做到这一点:文件共享、FTP、FrontPage。文件共享显然是最容易编程和最直接的。虽然可以使用 XCOPY 来移动站点,但我是一次移动一个文件,并边移动边构建目录。这使我能够通过 Publish.xml 文件来控制实际发布的构建文件和目录。

FTP 稍微复杂一些,但 .NET 通过使用 FtpWebRequest 对象使其更加容易。MSDN 提供了很多关于如何使用它的示例,但我想指出的一点是,对于 BIN 目录,您总是想清除您发布的 DLL。如果您从单个 DLL 切换到每个页面一个 DLL,您不希望旧的 DLL 还在那里。同样,您总是要确保您发布了项目中任何依赖项的并发版本。BIN 目录的 Publish.XML 默认设置为在发布新文件之前清除所有文件。

从开发角度来看,FrontPage 是最困难的方式。如果部署时您不介意它带来的开销,它是一个不错的选择,因为您可以跨防火墙进行发布。FrontPage 基本上将每个文件转换为字节数组,并通过端口 80 发送到目标网站上的 FrontPage 扩展(命名不当的文件夹中的 DLL)之一。然后,这些 DLL 会调用数据流上指定的程序。我喜欢使用文件共享,因为它速度快(如果您需要在紧急情况下发布,越快越好,而 FrontPage 速度非常慢)并且安全(FrontPage 被认为是极其不安全的)。尽管如此,我们还是使用 FrontPage,以便在家通过 VPN 在深夜发布我们的网站,这样可以尽量减少对用户的影响。很多时候,数据库更改也需要进行,因此总会有一点停机时间,所以深夜对我们来说是最佳选择。

结果:MyPublisher

首次为 Web 项目打开 MyPublisher 插件时,它会在网站的每个目录中添加一个 Publish.xml 文件。此文件本身不会被发布,但它允许开发人员阻止发布单个文件或整个目录。虽然文件和目录仍然会被构建,但它们只是没有被复制到目标服务器。

在第一个选项卡上,您会注意到可以发布多个网站到多个位置。这是为了应对我们的 Web 农场而设计的。此外,还支持三种发布方式:FrontPage、FTP 和文件共享。

Sample screenshot

在第二个选项卡上,所有源代码管理交互都在这里进行。当您发布时,如果您的项目不受源代码管理,这些选项将被忽略。

Sample screenshot

在第三个选项卡上,显示部署的状态。可能最简单但最有用的功能是,在发布之前,显示目标和源的摘要。在不小心将未经测试的代码推送到生产环境之前,拥有此摘要非常重要,因此在按下“发布”按钮之前,拥有此摘要是个好主意。

结论

我们希望拥有一个文档齐全的 SourceSafe,并降低与发布相关的风险。我们才刚刚开始在我们的团队中使用它,所以我想 1.1 版本应该不远了。但在此之前,祝您发布愉快!

发布说明

  • MyPublisher 不会为您创建 FrontPage 网站。您必须先创建它们,然后才能发布。同样,您必须提前创建 FTP 发布和文件共享发布的根文件夹。
  • 未来版本将包含 VSTS 集成。
  • Web 部署项目必须保存在 Build 文件夹中,该文件夹是您的解决方案 *.sln 文件所在位置的子文件夹。
  • 如果您使用 FTP,FTP 用户名和密码是应用程序设置中的属性。我将在以后的版本中为此构建一个 UI。
  • FrontPage 发布不支持除端口 80 以外的任何端口。
  • 我应该指出,FrontPage 类是我通过 Google 搜索找到并修改的。我真的不记得我从哪里得到的,尽管我觉得应该注明出处。如果我能弄清楚,我会注明我应归功的地方。
© . All rights reserved.