自动化工具开发:简化Windows 7小工具构建过程

Windows 7时代,小工具开发过程中的构建步骤显得尤为繁琐。为了提高开发和测试的效率,决定编写一个简单的自动化工具来处理这些必要的步骤。本文不详细描述整个桌面小工具的开发过程,也不深入探讨所使用的代码库。本文的目的是为正在开发小工具的社区成员提供一个可能想要使用的工具,以帮助他们完成这个过程。文章将概述过程中采取的步骤,并简要介绍代码是如何工作的。

这个工具是使用Visual Studio2010(VB.NET)构建的,目标是.NET 4.0,在Windows 7Ultimate上安装。

桌面小工具实际上是一系列文件和文件夹的集合,主要包括HTML文件、CSS文件、图像文件、JavaScript文件,当然还有定义小工具的小工具清单。这些文件和文件夹可以有多级嵌套,也可以是包含所有必要文件的单个文件夹。

小工具文件是一个zip文件,包含了所有文件和文件夹,小工具根文件夹(包含manifest.xml的文件夹)位于树的顶部,所有其他文档都是相对于这个文件夹的。

当对小工具的源代码进行更改时,必须经历打包和安装的过程,以便测试小工具。打包小工具所需的步骤包括:

  • 从开发文件夹中移除旧的.gadget文件。
  • 创建一个包含所有文件的zip文件,可以通过选择所有文件和文件夹,然后“发送到压缩(zipped)文件夹”来轻松完成。
  • 将zip文件重命名为.gadget扩展名。
  • 执行小工具文件以安装。

现在,可以想象,重复这样做以测试小工具更改会变得非常乏味,所有这些左键点击、右键点击、发送到、重命名等,在资源管理器中最终会让发疯。是时候让自动化来处理这项工作了!

使用GadgetPacker

这个工具不需要设置任何设置,它没有选项,设计非常简单。这个工具的编写方式是,如果正在开发多个小工具,可以简单地将应用程序的EXE复制并粘贴到每个开发文件夹中。

需要做的是将GadgetPacker.exe文件复制到开发文件夹中,并将其重命名为小工具将要被命名为的名称。例如,如果最终小工具名称将是SomeGadget.gadget,那么就将GadgetPacker.exe重命名为SomeGadget.exe,就是这样。

当准备好构建小工具时,只需双击/运行GadgetPacker EXE。然后它将按照下面确定的步骤构建小工具。

只有一个隐藏特性,那就是'AutoClose'覆盖,可以看到这在应用程序的屏幕截图中已经被激活了。所需要做的就是在应用程序运行时按下Shift键,这将防止应用程序关闭,允许阅读日志(如果愿意的话)。还有一个'ReRun'按钮可以按下,如果希望在阻止'AutoClose'后手动重新启动过程。

采取的步骤

构建小工具时,工具将经历以下步骤:

  • 确定小工具根的路径,以及小工具和临时构建文件的适当文件名。
  • 移除任何可能存在的以前的临时小工具文件(如果应用程序意外崩溃,只应该发生这种情况!)。
  • 对所有文件夹和子文件夹进行全面扫描。
  • 从发现的文件列表中移除GadgetPacker和任何以前的Gadget文件。
  • 创建一个新的临时zip小工具文件。
  • 将步骤#3中的所有文件添加到zip文件中,包括从Windows注册表中查找每个文件的MIME类型。
  • 将临时小工具zip复制到最终小工具文件名,如果已经存在一个,则覆盖它。
  • 删除临时小工具zip。
  • 执行小工具文件以启动Windows安装小工具。
  • 如果没有按下Shift键,则退出工具,否则不要退出。

感兴趣的点

目录扫描是一个简单的递归循环,它使用一个List<of String>填充所有找到的文件:

Private Sub Dir(ByVal Path As String) Dim files As New List(Of String) Dim dirs As New List(Of String) files = Directory.GetFiles(Path).ToList dirs = Directory.GetDirectories(Path).ToList For Each item As String In files buildFiles.Add(item.ToLower) ' switch everything to lower case WriteMessage(item, True) Next For Each item As String In dirs Dir(item) Next End Sub

WindowsBase DLL中找到的System.IO.Packaging命名空间包含创建和处理zip文件所需的类。下面的例程是如何将每个文件添加到新创建的zip中:

Private Sub buildGadget() WriteMessage(String.Empty, True) WriteMessage("Build Gadget File.........", True) Dim progressStartVal = ProgressBar.Value Dim progressTargetVal = 90 Dim fileCount As Integer = 0 ' Create the temp package Using zip As ZipPackage = ZipPackage.Open(zipFilePath + "\" + zipFileNameTemp, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None) ' Process each part For Each item As String In buildFiles ' Take each file, create the relevant info for the zip file Dim partUri As Uri = PackUriHelper.CreatePartUri(New Uri(getURI(item), UriKind.Relative)) WriteMessage("Adding: " + partUri.ToString, True) ' Create the package part Dim zipPart As ZipPackagePart = _ zip.CreatePart(partUri, getMimeType(item)) ' Copy the Source data to the package part Using fileStream As New FileStream(item, FileMode.Open, FileAccess.Read) CopyStream(fileStream, zipPart.GetStream()) End Using fileCount += 1 ProgressBar.Value = ((progressTargetVal - progressStartVal) * (fileCount / buildFiles.Count)) + progressStartVal Next End Using WriteMessage("Added " + fileCount.ToString + " item(s) to gadget.", True) End Sub

使用打包时需要注意的一点是,如果用资源管理器打开zip文件,会注意到一个名为[ContentTypes].xml的文件,它包含了所有已识别的MIME类型。这个文件是自动添加的,不能移除。然而,它对小工具的整体没有影响。基于此,没有尝试移除它,也没有寻找其他zip库来替代框架中的一部分。

MIME类型查找是通过获取每个文件的扩展名,并在注册表中查找来执行的。如果找不到特定的扩展名,则使用自定义MIME类型。这些记录在[ContentTypes].xml文件中,因此对小工具的目的没有影响。执行查找的代码如下所示:

Private Function getMimeType(ByVal path As String) As String Dim mime = String.Empty Dim ext = System.IO.Path.GetExtension(path).ToLower() Dim rk As Microsoft.Win32.RegistryKey = _ My.Computer.Registry.ClassesRoot.OpenSubKey(ext) Try mime = rk.GetValue("Content Type").ToString() Catch ex As Exception WriteMessage("ERROR: Cannot determine content type for: " + path + "; Setting to contentype/unknown", True) mime = "contenttype/uknown" End Try Return mime End Function

小工具安装过程是通过使用Process.Start("gadgetpathandname")来启动的,这将导致Windows提示用户确认他们是否希望安装小工具。如果小工具已经存在,Windows还会提示用户是否希望覆盖它。

在代码片段中,WriteMessage(),这是一个简单的助手,用于更新表单上的日志条目,它有两个签名,一个简单地追加消息,另一个添加CRLF序列。

在开发小工具和构思工具时,以下是一些可能感兴趣的网站:

接下来

真的没有什么要补充的了,这个工具是免费使用的。如果有任何想法等,让知道。

现在可以回到开发第一个桌面小工具,所以希望有一天会有一篇文章。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485