Hướng dẫn cài đặt tất cả thư viên cho python năm 2024
Python là ngôn ngữ chính cho hệ thống backend của AgriConnect. Với đội ngũ giàu kinh nghiệm về Python, luôn đẩy sự khai thác, “bóc lột” Python đến mức cao nữa, cao nữa, nên quá trình vận hành của AgriConnect thường dẫn đến những nhu cầu “không giống ai”. Một trong số đó là nhu cầu dựng một kho chứa gói thư viện Python “tại nhà”. Bài dưới đây xin chia sẻ kinh nghiệm như thế. Khi hệ thống của AgriConnect vận hành, tác vụ cài đặt các gói thư viện Python được thực hiện lặp đi lặp lại rất nhiều lần. Chúng đến từ:
Đa số các máy mà quá trình cài đặt thư viện Python diễn ra, đều nằm ở Việt Nam, nên việc để
Trước đây tôi tận dụng một số dịch vụ cloud, để chứa các gói Python này. Các dịch vụ gồm có: PackageCloud, Gemfury, CloudSmith. Ưu điểm của chúng:
Thế nhưng dần dần tôi thấy những dịch vụ kia vẫn còn trở ngại nhỏ:
Nên tôi quyết định tận dụng các server sẵn có (hầu hết đặt trong nước) đề làm kho lưu luôn. Tôi không có nhu cầu setup một trang với chức năng đầy đủ, y xì như PyPI. Cái tôi cần là:
Sau một lúc rà qua các phần mềm khác nhau thì tôi thấy server { }
3 gần với ý đồ của tôi nhất. Đặc điểm của server { }
4:
Chỉ có điều, trái với mong đợi của tôi, cách setup ban đầu của nó không nhanh tí nào. Lí do là tác giả ưu tiên tình huống lưu file trên S3 nên tài liệu tập trung vào nó hơn. Hướng dẫn với Nginx thì sơ sài, thậm chí cũ, chẳng biết dành cho Nginx đời nào mà đem cho Nginx mới (trên Ubuntu 19+) thì bị báo lỗi. Đó là lí do tôi phải ghi ra bài này. Tham khảo việc làm Python Hồ Chí Minh hấp dẫn! Giả sử tôi dùng thư mục /srv/PyPI làm kho lưu các gói. Do nhu cầu “hỗ trợ đa nền tảng” ở trên mà trong thư mục này tôi lại chia ra thêm 2 thư mục con:
Do tên các gói của Python không phân biệt /srv/PyPI/glibc$ tree -L 1 . ├── gen.sh ├── packages/ ├── packages.txt 0 và /srv/PyPI/glibc$ tree -L 1
.
├── gen.sh
├── packages/
├── packages.txt
1 nên ta phải cấu hình cho Nginx sao cho khi /srv/PyPI/glibc$ tree -L 1 . ├── gen.sh ├── packages/ ├── packages.txt 3 thì Nginx vẫn trả về /srv/PyPI/glibc$ tree -L 1 . ├── gen.sh ├── packages/ ├── packages.txt 4. Để thực hiện được tính năng này thì ta sẽ viết một hàm Lua ngắn phụ trợ cho Nginx. Trước tiên, cần cài module Lua cho Nginx. Trên Ubuntu/Debian thì cài bằng lệnh sau: sudo apt install libnginx-mod-http-lua Tạo một file cấu hình virtual host cho Nginx. Ví dụ, trên Ubuntu thì tạo file /etc/nginx/sites-available/pypi.conf với nội dung như sau: server { }
Lưu ý rằng cấu hình này cũng bật HTTPS cho kho lưu của chúng ta (ví dụ pypi.agriconnect.vn), không thì sẽ phải nghe pip càm ràm khi tải gói qua HTTP trần.Trong mỗi thư mục trên, ta lại sẽ bố trí các file như sau: /srv/PyPI/glibc$ tree -L 1 . ├── gen.sh ├── packages/ ├── packages.txt Trong đó thư mục packages là nơi ta sẽ upload các file *.whl lên. File gen.sh là script mà ta sẽ chạy để sinh ra cấu trúc thư mục tương tự nhìn thấy trên PyPI qua con mắt của pip, để nó biết có thể download được gói nào từ server này. Nội dung của gen.sh như sau: #!/bin/sh dumb-pypi --package-list packages.txt --packages-url ../../packages --output-dir . Không biết vì lý do gì mà tác giả của server { }
3 không cho nó tự nhìn vào thư mục packages để tự lập danh sác các gói, mà phải nhận đầu vào là một file chứa sẵn danh sách các gói, là file packages.txt. Mặc dù server { }
3 hơi ngu (đúng với cái tên dumb) nhưng ta có thể sinh ra file đó rất dễ dàng như sau:$ cd packages $ ls > ../packages.txt Mỗi lần upload gói mới, ta sẽ cần tạo lại file packages.txt, chạy lại ./gen.sh để sinh ra các thư mục như sau: $ broot
/srv/PyPI/glibc
├──gen.sh
├──index.html
├──packages
│ ├──asyncpg-0.18.3-cp37-cp37m-linux_armv7l.whl
│ ├──Brotli-1.0.7-cp37-cp37m-linux_armv7l.whl
│ ├──cchardet-2.1.5-cp37-cp37m-linux_armv7l.whl
│ ├──cffi-1.13.2-cp37-cp37m-linux_armv7l.whl
│ └──60 unlisted
├──packages.txt
├──pypi
│ ├──aiohttp …
│ ├──asyncpg …
│ ├──brotli …
│ ├──cchardet …
│ ├──cffi …
│ └──30 unlisted
└──simple
├──aiohttp …
├──asyncpg …
├──brotli …
├──cchardet …
├──cffi …
└──32 unlisted
Từ đây trở đi, mỗi lần sử dụng pip install --extra-index-url=https://pypi.agriconnect.vn/glibc/simple thì pip sẽ ưu tiên dò tìm và tải gói từ kho riêng của chúng ta. Nếu ta không trực tiếp dùng pip, mà quản lý gói phụ thuộc bằng công cụ khác, như Poetry chẳng hạn, thì ta truyền cấu hình kho riêng qua biến môi trường, ví dụ: export PIP_EXTRA_INDEX_URL=https://pypi.agriconnect.vn/glibc/simple
poetry add asyncpg
poetry install --no-root
Hình ảnh cho thấy Nhân đây, pypi.agriconnect.vn là một địa chỉ kho thật và bạn có thể dùng chung nó với chúng tôi (chỉ được download thôi nhé) nếu có cùng đam mê với Python. Cập nhật
Hy vọng qua bài viết này sẽ giúp bạn biết cách tạo kho lưu cho các gói thư viện Python. Đừng quên truy cập Topdev để cập nhật các tin tuyển dụng IT mới nhất bạn nhé! |