Ruby 语言 实现命令行待办事项工具 Thor+SQLite

Ruby阿木 发布于 2025-06-09 7 次阅读


Ruby 命令行待办事项工具:使用 Thor 和 SQLite 构建

在软件开发和日常工作中,待办事项列表是一个非常有用的工具。它可以帮助我们跟踪任务、管理时间,并确保我们不会忘记任何重要的工作。在 Ruby 社区中,Thor 和 SQLite 是构建命令行应用程序的流行选择。本文将介绍如何使用 Thor 和 SQLite 来创建一个简单的命令行待办事项工具。

Thor 是一个用于创建命令行应用程序的 Ruby 框架,它提供了一个简单而强大的方式来定义和管理命令。SQLite 是一个轻量级的数据库引擎,它不需要服务器进程,非常适合小型应用程序和原型设计。

在这个项目中,我们将创建一个名为 `todo` 的命令行工具,它将允许用户添加、列出、完成和删除待办事项。以下是实现这个工具的步骤。

准备工作

确保你已经安装了 Ruby 和 SQLite。大多数操作系统都预装了 SQLite,而 Ruby 通常也包含在内。如果没有,你可以通过包管理器安装它们。

创建项目结构

创建一个新的目录来存放你的项目,并在其中创建以下文件和目录:


todo/
|-- db/
| |-- todo.db
|-- lib/
| |-- todo.rb
|-- Gemfile
|-- Rakefile
|-- todo.gemspec

安装依赖

在你的项目根目录中,创建一个 `Gemfile` 文件并添加以下内容:

ruby
source 'https://rubygems.org'

gem 'thor'
gem 'sqlite3'

然后,运行 `bundle install` 来安装这些依赖。

创建数据库和模型

在 `lib/` 目录下创建一个名为 `todo.rb` 的文件,并添加以下代码来定义待办事项模型和数据库连接:

ruby
require 'sqlite3'

class Todo
def self.db
@db ||= SQLite3::Database.new('db/todo.db')
end

def self.create_table
db.execute <<-SQL
CREATE TABLE IF NOT EXISTS todos (
id INTEGER PRIMARY KEY,
description TEXT NOT NULL,
completed BOOLEAN NOT NULL DEFAULT 0
);
SQL
end

def self.all
db.execute('SELECT FROM todos').map do |row|
Todo.new(row)
end
end

def self.find(id)
todo = db.execute('SELECT FROM todos WHERE id = ?', id).first
todo ? Todo.new(todo) : nil
end

def initialize(attributes)
@id = attributes['id']
@description = attributes['description']
@completed = attributes['completed']
end

def description
@description
end

def completed?
@completed
end

def complete!
db.execute('UPDATE todos SET completed = 1 WHERE id = ?', @id)
@completed = true
end
end

Todo.create_table

这段代码定义了一个 `Todo` 类,它包含创建数据库表、查询所有待办事项、查找特定待办事项和完成待办事项的方法。

创建 Thor 命令

在 `lib/` 目录下创建一个名为 `todo_commands.rb` 的文件,并添加以下代码来定义 Thor 命令:

ruby
require 'thor'

class TodoCommands < Thor
desc "list", "List all todos"
def list
todos = Todo.all
puts "Todo List:"
todos.each do |todo|
puts "{todo.id}. {todo.description} - {todo.completed? ? 'Completed' : 'Incomplete'}"
end
end

desc "add ", "Add a new todo"
def add(description)
Todo.new(description: description).complete!
puts "Todo added: {description}"
end

desc "complete ", "Complete a todo"
def complete(id)
todo = Todo.find(id)
if todo
todo.complete!
puts "Todo {id} completed."
else
puts "Todo with id {id} not found."
end
end

desc "delete ", "Delete a todo"
def delete(id)
todo = Todo.find(id)
if todo
db = Todo.db
db.execute('DELETE FROM todos WHERE id = ?', id)
puts "Todo {id} deleted."
else
puts "Todo with id {id} not found."
end
end
end

这段代码定义了一个 `TodoCommands` 类,它继承自 `Thor::Base`。它包含四个命令:`list`、`add`、`complete` 和 `delete`。

创建 Rake 任务

在项目根目录中创建一个 `Rakefile` 文件,并添加以下代码来定义一个 Rake 任务来运行 Thor 命令:

ruby
require 'rake'
require 'thor'

task :default => 'todo:run'

namespace :todo do
desc "Run the todo command line tool"
task :run => :environment do
TodoCommands.start(ARGV)
end
end

这段代码定义了一个默认任务 `:default`,它依赖于 `todo:run` 任务。`todo:run` 任务加载环境并启动 `TodoCommands`。

使用你的待办事项工具

现在,你可以通过以下命令来使用你的待办事项工具:

sh
rake todo:run list

这将列出所有待办事项。你可以使用以下命令来添加、完成或删除待办事项:

sh
rake todo:run add "Buy milk"
rake todo:run complete 1
rake todo:run delete 1

总结

通过使用 Thor 和 SQLite,我们创建了一个简单的命令行待办事项工具。这个工具可以帮助用户管理他们的待办事项,并且可以很容易地扩展和修改。这个例子展示了如何使用 Ruby 的强大功能来构建有用的命令行应用程序。