# Giới thiệu odoo-addons-path: công cụ giúp lập trình viên quản lý addons path trong Odoo

> odoo-addons-path tự nhận diện các cấu trúc dự án Odoo phổ biến và tạo addons_path theo đúng thứ tự, để lập trình viên không phải thiết lập thủ công.

**Source:** <https://trobz.com/vi/insights/introducing-odoo-addons-path/>

---


Thiết lập [`addons_path`](https://www.odoo.com/documentation/19.0/developer/reference/cli.html#cmdoption-odoo-bin-addons-path) trong dự án Odoo trông có vẻ đơn giản, cho đến khi phải quản lý nhiều repository, submodule và nhiều thứ khác. Mỗi cấu trúc dự án sắp xếp addon theo cách riêng, và thứ tự các thư mục rất quan trọng: chỉ một thư mục đặt sai vị trí cũng có thể âm thầm ghi đè module hoặc nạp nhầm module tùy chỉnh.

[odoo-addons-path](https://github.com/trobz/odoo-addons-path) giúp gỡ bỏ gánh nặng đó. Công cụ tự nhận diện cấu trúc dự án và tạo `addons_path` cuối cùng theo đúng thứ tự, để lập trình viên không phải thiết lập thủ công và dễ mắc lỗi.

## odoo-addons-path là gì?

odoo-addons-path là một công cụ dòng lệnh chỉ làm đúng một việc:

- Tự nhận diện các cấu trúc dự án Odoo phổ biến: Camptocamp, Doodba, Odoo.sh và Trobz
- Tạo `addons_path` chính xác, đúng thứ tự và sẵn sàng sử dụng
- Áp dụng cùng một logic nhận diện cho mọi cấu trúc thông qua mẫu thiết kế Chain of Responsibility ([tìm hiểu thêm về mẫu thiết kế này]({{< surl >}}/vi/insights/design-patterns-odoo-chain-of-responsibility/))

Công cụ tập trung vào một việc và làm tốt việc đó: tạo ra `addons_path` đáng tin cậy, dễ dự đoán cho mọi codebase Odoo.

## Vì sao chúng tôi xây dựng công cụ này

Chưa có một cấu trúc chuẩn chung cho các dự án Odoo. Mỗi đội ngũ áp dụng một cấu trúc khác nhau, chẳng hạn:

**Trobz**

```text
├── odoo/        # Odoo core
├── addons/      # Third-party repos
└── project/     # Custom modules
```

**Doodba**

```text
odoo/custom/src/
├── odoo/        # Odoo core
├── private/     # Custom modules
└── submodule/   # Third-party repos
```

**Odoo.sh**

```text
├── odoo/        # Odoo core
├── enterprise/
├── themes/
└── user/        # Submodules
```

Vì mỗi cấu trúc cần được xử lý theo cách khác nhau, việc tự tạo `addons_path` rất mất công và dễ sai. odoo-addons-path ra đời để chuẩn hóa quy trình này cho các cấu trúc phổ biến.

## Cách sử dụng

### Bắt đầu nhanh

Trong thư mục dự án Odoo, chạy:

```bash
odoo-addons-path
```

Công cụ sẽ xuất ra `addons_path` sẵn sàng sử dụng. Nếu dự án theo một trong các cấu trúc được hỗ trợ, việc nhận diện sẽ hoạt động ngay. Các cấu trúc được hỗ trợ sẵn:

- Camptocamp (cả cấu trúc cũ và mới)
- Doodba (phát triển dựa trên Docker)
- Odoo.sh (nền tảng hosting chính thức của Odoo)
- Trobz

Thêm `--verbose` để xem cách các thư mục được phân loại.

### Đường dẫn tùy chỉnh

Có thể bỏ qua cơ chế nhận diện bằng `--addons-dir`. Tùy chọn này hỗ trợ nhiều đường dẫn và glob pattern.

Tìm addon theo phiên bản:

```bash
odoo-addons-path --addons-dir "./oca/*/18.0"
```

Nhiều thư mục repository:

```bash
odoo-addons-path --addons-dir "./oca/*/18.0,./custom"
```

Cũng có thể chỉ định đường dẫn codebase qua biến môi trường:

```bash
export CODEBASE=/path/to/project
odoo-addons-path
```

### Thứ tự các thư mục có quan trọng không?

Có. Công cụ đảm bảo:

- **Module gốc của Odoo luôn đứng đầu** để không bị ghi đè nhầm. `odoo/addons` và `odoo/odoo/addons` luôn nằm ở đầu kết quả.
- **Các thư mục do người dùng chỉ định giữ nguyên thứ tự.** Những đường dẫn truyền qua `--addons-dir` giữ đúng thứ tự đã nhập, nhờ đó có thể ưu tiên repository mong muốn. Điều này đặc biệt quan trọng khi một dự án cần ưu tiên một thư mục addon cụ thể.
- **Các thư mục tự nhận diện được sắp xếp theo thứ tự chữ cái**, giúp kết quả nhất quán và dễ dự đoán.

## Kết luận

odoo-addons-path loại bỏ phần việc thủ công, cùng những rủi ro tiềm ẩn, khi tạo `addons_path` cho Odoo. Dù dự án theo cấu trúc chuẩn hay cấu trúc riêng, công cụ đều nhận diện và sắp xếp đúng thứ tự các thư mục addon: module lõi của Odoo luôn được ưu tiên, và vẫn có thể ưu tiên từng repository khi cần.

Dùng thử:

```bash
uv tool install odoo-addons-path
odoo-addons-path /path/to/your/project
```

