BBuilder:开源批处理构建器
关于 BBuilder - 开源批处理构建器的文章

引言
有一天,我的朋友告诉我,他需要改变发布构建的方式。这意味着他必须修复一个批处理文件来编译和发布多个产品。由于它必须非常可靠,并且您必须记住所有必需的 DOS 命令,因此这个过程可能很繁琐。批处理文件的每个步骤实际上都是一个可以在纯 DOS 中完成或执行外部可执行文件的命令。所以我认为以以下方式制作一个批处理编辑器会很酷
- 从工具箱中选择一个命令
- 支持重新排序
- 将其保存到磁盘以供将来使用
- 以简单的方式可视化所有命令
- 启用添加自定义工具作为插件
- 在将其部署到某处(计划任务)之前,通过优化来测试批处理
显然,我脑海中有一个应用程序,它有一个工具箱,可以将命令拖放到批处理文档表单上。外观和感觉类似于 Outlook (OLAF)。这样,我们可以轻松地编辑/向上移动、向下移动/删除项目。如果有人需要在他的批处理过程中使用自定义命令怎么办?
比方说,我的朋友需要编译(使用 .NET 编译器)并将其工作发布到几个目录中。这意味着在任何事情之前,重启一些 IIS 服务并备份旧版本。向他的团队发送电子邮件,告诉他们在他上传新版本时休息一下。版本成功上传并通过自动化崩溃测试后,他们会收到警报。流程中的所有这些步骤都可以分解为原子操作,例如:编译、备份、重启服务、复制、发送电子邮件等…… 但将工具箱限制在我们的开发范围内似乎是个错误,因为我们每个人都需要一些其他操作。我决定以开发人员添加自己的工具的方式构建工具箱。插件机制。由于我喜欢使用 .NET (C#) 编程,所以我开始使用反射来编码我的插件平台。
背景
本文介绍了一种创建灵活应用程序的简单方法,遵循以下架构

契约
平台本身不知道插件集合。但它肯定知道接口 BBuilder.Interface
。在加载时,应用程序会加载所有实现 BBuilder.Interface
的程序集。
“契约”分为两部分
- 视觉契约 — UserControl (ActionPanelControl),它定义了所有默认值和 UI 验证
- 功能契约 — 接口 (IActionPanel),它定义了插件的实际逻辑:它生成命令行的方式。
反射是“黑魔法”吗?
工厂用于提供所需程序集的实例;它使用反射。
public IActionPanel GetInstanceOfPlugin(string type,string assemblyPath)
{
if (!dictPlugins.ContainsKey(type))
{
dictPlugins.Add(type, LoadPluginAssembly(assemblyPath));
}
return Activator.CreateInstance(
dictPlugins[type].GetType(type)) as IActionPanel;
}
Using the Code
本教程应该允许您在几个步骤内添加一个名为“搜索”的新插件
- 创建一个新项目作为“类库”,命名为“BBuilder.Plugins.Search”
- 添加一个新项目作为用户控件
- 例如,将其命名为“Search.cs”
- 添加一个新项目作为资源文件
- 将其重命名为“Resource.resx”
- 双击“Resource.resx”。添加一个名为“Search”的图像资源。
- 单击搜索图像并转到属性 (F4)
- 将持久性更改为“嵌入到 .resx 中”,然后保存并关闭。
- 添加对 BBuilder.Interface DLL 的引用
- 在 Search.cs 中 — 更改为以下几行
- 编译项目
- 将“BBuilder.Plugins.Search.dll”复制到“C:\Program Files\Breezback\BBuilder\Plugins”
using BBuilder.Interface;
namespace BBuilder.Plugins.Search
{
public partial class Search : ActionPanelControl,IActionPanel
{
public Search()
{
InitializeComponent();
}
#region IActionPanel Members
public string Category
{
get { return "BBuilder"; }
}
public string AuthorName
{
get { return "Breeback\nDownload updates at" +
"http://www.breezback.com."; }
}
public string ImageKey
{
get { return "Search"; }
}
public string ActionName
{
get { return "Search Files and Folders"; }
}
public string Description
{
get { return "search for files and folders"; }
}
public string CommandLine
{
get { return "echo my commandline goes here"; }
}
public System.Drawing.Bitmap Image
{
get
{
return Resource.Search;
}
}
public string Serialize()
{
// need to return an encoded string for saving the action
// to file
return "";
}
public void Deserialize(string strPanel)
{
// need to decode the expected string to the settings of
// the plugin
}
#endregion
}
}
关注点
- 用于灵活应用程序的反射
- 工厂和单例设计模式
- IComparer 实现以生成自定义顺序
- 使用专业外观的 Windows 应用程序,例如 Outlook。 具有覆盖呈现功能的强大网格
- Spawn process for Shell : 重定向输入/输出
- 使用 Background worker 创建响应式 UI
- 使用设置项目部署应用程序,具有自定义文件类型和图标
历史
08-16-2003:
- 添加了第一个版本
致谢
我想感谢所有在这个项目中帮助我的人,即使是无意识的
- OLAF 项目 – 适用于卓越的网格
- Noogen 项目适用于验证器
- Gregory Young 感谢他的专业知识
- Dina 感谢她的耐心