在Windows 7时代,小工具开发过程中的构建步骤显得尤为繁琐。为了提高开发和测试的效率,决定编写一个简单的自动化工具来处理这些必要的步骤。本文不详细描述整个桌面小工具的开发过程,也不深入探讨所使用的代码库。本文的目的是为正在开发小工具的社区成员提供一个可能想要使用的工具,以帮助他们完成这个过程。文章将概述过程中采取的步骤,并简要介绍代码是如何工作的。
这个工具是使用Visual Studio2010(VB.NET)构建的,目标是.NET 4.0,在Windows 7Ultimate上安装。
桌面小工具实际上是一系列文件和文件夹的集合,主要包括HTML文件、CSS文件、图像文件、JavaScript文件,当然还有定义小工具的小工具清单。这些文件和文件夹可以有多级嵌套,也可以是包含所有必要文件的单个文件夹。
小工具文件是一个zip文件,包含了所有文件和文件夹,小工具根文件夹(包含manifest.xml的文件夹)位于树的顶部,所有其他文档都是相对于这个文件夹的。
当对小工具的源代码进行更改时,必须经历打包和安装的过程,以便测试小工具。打包小工具所需的步骤包括:
现在,可以想象,重复这样做以测试小工具更改会变得非常乏味,所有这些左键点击、右键点击、发送到、重命名等,在资源管理器中最终会让发疯。是时候让自动化来处理这项工作了!
这个工具不需要设置任何设置,它没有选项,设计非常简单。这个工具的编写方式是,如果正在开发多个小工具,可以简单地将应用程序的EXE复制并粘贴到每个开发文件夹中。
需要做的是将GadgetPacker.exe文件复制到开发文件夹中,并将其重命名为小工具将要被命名为的名称。例如,如果最终小工具名称将是SomeGadget.gadget,那么就将GadgetPacker.exe重命名为SomeGadget.exe,就是这样。
当准备好构建小工具时,只需双击/运行GadgetPacker EXE。然后它将按照下面确定的步骤构建小工具。
只有一个隐藏特性,那就是'AutoClose'覆盖,可以看到这在应用程序的屏幕截图中已经被激活了。所需要做的就是在应用程序运行时按下Shift键,这将防止应用程序关闭,允许阅读日志(如果愿意的话)。还有一个'ReRun'按钮可以按下,如果希望在阻止'AutoClose'后手动重新启动过程。
构建小工具时,工具将经历以下步骤:
目录扫描是一个简单的递归循环,它使用一个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序列。
在开发小工具和构思工具时,以下是一些可能感兴趣的网站:
真的没有什么要补充的了,这个工具是免费使用的。如果有任何想法等,让知道。
现在可以回到开发第一个桌面小工具,所以希望有一天会有一篇文章。