附录A:一个完整项目的组成 📦
为什么别人的项目都有 README、LICENSE 这些文件?本章详解一个专业开源项目需要哪些文件。
📋 目录
标准项目结构
🌟 一个专业的开源项目应该长这样
my-awesome-project/
├── 📄 README.md # 项目说明书(必需!)
├── 📄 LICENSE # 开源协议(必需!)
├── 📄 .gitignore # 忽略文件列表(必需!)
├── 📄 CONTRIBUTING.md # 贡献指南
├── 📄 CODE_OF_CONDUCT.md # 行为准则
├── 📄 CHANGELOG.md # 更新日志
├── 📄 SECURITY.md # 安全披露政策
├── 📄 AUTHORS.md # 作者列表
├── 📁 src/ # 源代码目录
├── 📁 tests/ # 测试代码目录
├── 📁 docs/ # 文档目录
├── 📁 examples/ # 示例代码目录
├── 📁 .github/ # GitHub 配置目录
│ ├── 📁 ISSUE_TEMPLATE/ # Issue 模板
│ ├── 📁 PULL_REQUEST_TEMPLATE/ # PR 模板
│ └── 📄 workflows/ # GitHub Actions 配置
└── 📄 package.json # Node.js 项目的依赖配置
📄 requirements.txt # Python 项目的依赖配置
📄 Cargo.toml # Rust 项目的依赖配置
必需文件详解
1️⃣ README.md(必需!)
作用:项目的”门面”,是别人了解你项目的第一个窗口。
为什么需要:
- 📖 告诉别人你的项目是做什么的
- 🚀 告诉别人如何安装和使用
- 🤝 告诉别人如何贡献代码
标准 README 应该包含:
# 项目名
[简短的项目描述]
## ✨ 特性
- 特性1
- 特性2
## 🚀 快速开始
[安装和使用说明]
## 📖 文档
[详细文档链接]
## 🤝 贡献
欢迎贡献!请查看 [CONTRIBUTING.md](https://github.com/GTX950L/github-encyclopedia/blob/main/CONTRIBUTING.md)。
## 📜 许可证
本项目采用 [MIT License](https://github.com/GTX950L/github-encyclopedia/blob/main/LICENSE)。
示例:查看 Vue.js 的 README
2️⃣ LICENSE(必需!)
作用:告诉别人可以如何使用你的代码。
为什么需要:
- ⚖️ 没有 LICENSE = 默认版权保护 = 别人不能使用和修改!
- 📜 明确的法律许可,避免法律纠纷
- 🌍 让项目真正”开源”
常见开源协议对比:
| 协议 | 允许商用 | 允许修改 | 需要注明作者 | 要求开源你的修改 |
|---|---|---|---|---|
| MIT | ✅ | ✅ | ✅ | ❌ |
| Apache 2.0 | ✅ | ✅ | ✅ | ❌ |
| GPL v3 | ✅ | ✅ | ✅ | ✅(强) |
| AGPL | ✅ | ✅ | ✅ | ✅(更强,包括云服务) |
如何选择:
你的项目是...?
│
├─ 想让更多人使用,不在乎别人是否开源?
│ └─ 选择 MIT 或 Apache 2.0 ✅
│
├─ 想让修改后的版本也必须开源?
│ └─ 选择 GPL ✅
│
└─ 只是自己用,不想让别人用?
└─ 不需要开源,不用放 LICENSE
如何添加 LICENSE:
方法1:在 GitHub 上创建仓库时自动生成
创建新仓库时,在 "Initialize this repository with:" 部分
勾选 "Add a license" → 选择协议
方法2:手动创建
# 在项目根目录创建 LICENSE 文件
echo "MIT License" > LICENSE
# 然后复制协议全文进去
方法3:使用命令行工具
# 使用 lice 工具快速生成
npm install -g lice
lice mit > LICENSE
3️⃣ .gitignore(必需!)
作用:告诉 Git 哪些文件不需要版本控制。
为什么需要:
- 🚫 避免提交敏感信息(密钥、密码)
- 🗑️ 避免提交无用文件(编译产物、缓存)
- 📦 减小仓库体积
标准 .gitignore 示例(Node.js 项目):
# 依赖目录
node_modules/
# 编译产物
dist/
build/
# 环境变量文件(可能包含密钥!)
.env
.env.local
# 日志文件
logs/
*.log
# 系统文件
.DS_Store # macOS
Thumbs.db # Windows
# IDE 配置
.vscode/
.idea/
*.swp
# 测试覆盖率报告
coverage/
如何生成 .gitignore:
方法1:GitHub 自动生成
创建仓库时,在 "Add .gitignore" 处选择语言
GitHub 会自动生成适合该语言的 .gitignore
方法2:使用 gitignore.io
# 访问 https://www.gitignore.io/
# 输入语言/框架,自动生成
# 或者在命令行使用
curl https://www.gitignore.io/api/node,visualstudiocode,osx > .gitignore
可选但推荐的文件
4️⃣ CONTRIBUTING.md(强烈推荐)
作用:告诉别人如何为你的项目做贡献。
为什么需要:
- 🤝 降低贡献门槛
- 📋 统一代码风格
- 🐛 规范 Bug 报告格式
标准内容:
# 贡献指南
## 🐛 报告 Bug
请使用我们的 Bug Report Issue 模板。
## ✨ 提出新功能
请先创建 Feature Request Issue 讨论。
## 🔀 提交 Pull Request
1. Fork 本项目
2. 创建你的分支 (`git checkout -b feature/AmazingFeature`)
3. 提交你的修改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 创建一个 Pull Request
## 📋 代码规范
- 使用 2 空格缩进
- 变量名使用驼峰命名法
- 提交信息使用英文
5️⃣ CODE_OF_CONDUCT.md(推荐)
作用:制定社区行为准则,营造友好的交流环境。
为什么需要:
- 🌍 让所有人感到欢迎
- 🚫 明确禁止骚扰、歧视等行为
- 📧 提供举报渠道
常用模板:Contributor Covenant
6️⃣ CHANGELOG.md(推荐)
作用:记录项目的版本更新历史。
为什么需要:
- 📊 让用户了解版本变化
- 🐛 方便回溯 Bug 引入的版本
- 📢 宣传新功能
标准格式(遵循 Keep a Changelog):
# Changelog
## [1.2.0] - 2026-06-01
### ✨ Added
- 新增深色模式
- 新增多语言支持
### 🐛 Fixed
- 修复登录失败的问题
- 修复移动端显示异常
### 🔄 Changed
- 优化加载速度
## [1.1.0] - 2026-05-01
### ✨ Added
- 初始版本
7️⃣ SECURITY.md(推荐)
作用:告诉别人如何报告安全漏洞。
为什么需要:
- 🔒 提供安全漏洞的私密报告渠道
- ⏳ 说明你会在多久内响应
- 💡 鼓励负责任的披露
标准内容:
# 安全披露政策
## 📧 报告安全漏洞
**请不要通过公开 Issue 报告安全漏洞!**
请发送邮件到:security@example.com
## ⏳ 响应时间
- 确认收到:24 小时内
- 初步评估:72 小时内
- 修复发布:根据严重程度,7-90 天
## 💡 负责任的披露
我们感谢您负责任地披露漏洞。在漏洞修复前,请不要公开讨论。
不同语言的项目结构
Python 项目
my_python_project/
├── 📄 README.md
├── 📄 LICENSE
├── 📄 .gitignore
├── 📄 requirements.txt # 依赖列表
├── 📄 setup.py # 安装脚本
├── 📄 pyproject.toml # 现代 Python 项目配置
├── 📁 my_module/ # 源代码
├── 📁 tests/ # 测试
├── 📁 docs/ # 文档
└── 📄 .flake8 # 代码风格配置
Node.js 项目
my-node-project/
├── 📄 README.md
├── 📄 LICENSE
├── 📄 .gitignore
├── 📄 package.json # 项目配置和依赖
├── 📄 package-lock.json # 依赖版本锁定
├── 📄 .eslintrc.json # 代码检查配置
├── 📁 src/ # 源代码
├── 📁 test/ # 测试
├── 📁 public/ # 静态资源
└── 📄 .env.example # 环境变量示例
Rust 项目
my-rust-project/
├── 📄 README.md
├── 📄 LICENSE
├── 📄 .gitignore
├── 📄 Cargo.toml # 项目配置和依赖
├── 📄 Cargo.lock # 依赖版本锁定
├── 📁 src/
│ └── 📄 main.rs # 主程序
├── 📁 tests/ # 集成测试
└── 📁 benches/ # 性能测试
如何快速生成这些文件
方法1:使用 GitHub 模板
创建新仓库时,选择 “Use this template”:
方法2:使用命令行工具
使用 cookiecutter(Python)
# 安装
pip install cookiecutter
# 使用模板创建项目
cookiecutter https://github.com/audreyfeldroy/cookiecutter-pypackage.git
使用 npm init(Node.js)
# 交互式创建 package.json
npm init
# 快速创建(使用默认值)
npm init -y
方法3:让 AI 帮你生成
示例 Prompt:
请帮我生成一个 Python 开源项目的标准文件结构,包括:
- README.md(项目是计算器库)
- LICENSE(MIT 协议)
- .gitignore(Python 项目)
- CONTRIBUTING.md
- 使用中文
AI 会为你生成所有文件!
📝 实战练习
练习1:创建标准项目结构
任务:
- 创建一个新的 GitHub 仓库
- 使用本文档的模板,创建所有必需文件
- 确保 LICENSE、README.md、.gitignore 都正确
练习2:为现有项目补上缺失的文件
任务:
- 找一个你之前的 GitHub 项目
- 检查是否缺少必需文件
- 补充 README.md、LICENSE、.gitignore
练习3:选择合适的开源协议
任务:
- 访问 https://choosealicense.com/
- 回答几个问题
- 确定你的项目应该用什么协议
📚 延伸阅读
- 第16章:开源协议选择 - 详解各种协议的区别
- 第15章:README 编写艺术 - 如何写出吸引人的 README
- 第11章:Projects 与项目管理 - 使用 Projects 管理任务
📝 本章小结
你现在了解了:
- ✅ 一个专业开源项目需要哪些文件
- ✅ 每个文件的作用和为什么需要它们
- ✅ 如何为不同语言的项目创建标准结构
- ✅ 如何快速生成这些文件
💡 核心要点
一个没有 README 和 LICENSE 的项目,不算是真正的开源项目!
README 告诉别人”这是什么”,LICENSE 告诉别人”你可以怎么用”。