Làm thế nào để tùy chỉnh một tệp tin request.txt cho nhiều môi trường?


112

Tôi có hai chi nhánh, Phát triển và Sản xuất. Mỗi cái đều có các phụ thuộc, một số khác nhau. Sự phát triển chỉ ra những phụ thuộc mà bản thân chúng đang được phát triển. Tương tự như vậy đối với Sản xuất. Tôi cần triển khai tới Heroku, dự kiến ​​sự phụ thuộc của mỗi nhánh trong một tệp duy nhất được gọi là 'request.txt'.

Cách tốt nhất để tổ chức là gì?

Những gì tôi đã nghĩ về:

  • Duy trì các tệp yêu cầu riêng biệt, một tệp trong mỗi nhánh (phải tồn tại khi hợp nhất thường xuyên!)
  • Cho Heroku biết tệp yêu cầu nào tôi muốn sử dụng (biến môi trường?)
  • Viết các kịch bản triển khai (tạo nhánh tạm thời, sửa đổi tệp yêu cầu, cam kết, triển khai, xóa nhánh tạm thời)

1
tập lệnh triển khai dễ dàng hơn: duy trì 2 tệp. sử dụng liên kết biểu tượng giữa chúng.
Udy

Câu trả lời:


208

Bạn có thể phân tầng các tệp yêu cầu của mình và sử dụng cờ "-r" để yêu cầu pip đưa nội dung của một tệp vào bên trong tệp khác. Bạn có thể chia nhỏ các yêu cầu của mình thành một hệ thống phân cấp thư mục mô-đun như sau:

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

Nội dung của tệp sẽ giống như sau:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

Bên ngoài Heroku, bây giờ bạn có thể thiết lập các môi trường như sau:

pip install -r requirements/dev.txt

hoặc là

pip install -r requirements/prod.txt

Vì Heroku tìm kiếm cụ thể cho "tests.txt" ở gốc dự án, nên nó chỉ phản chiếu sản phẩm, như thế này:

request.txt:

# Mirrors prod
-r requirements/prod.txt

2
Bạn đã bỏ qua vấn đề về cách sử dụng các tệp yêu cầu riêng biệt cho các môi trường khác nhau trên heroku.
Ed J

29
Tôi tin rằng câu trả lời của tôi đã giải quyết được điều đó.
Christian Abbott

1
Tôi đang tìm cách để có các yêu cầu khác nhau trên Heroku về dàn (nơi tôi muốn có thêm các gói gỡ lỗi) và môi trường sản xuất (nơi tôi không cần các gói gỡ lỗi này). Thật không may, như @EdJ đã nói, câu trả lời này không giải quyết vấn đề này.
Antoine Pinsard

1
Tôi có thể hiểu nhầm câu hỏi của bạn hoặc có lẽ câu hỏi của bạn khác với người đăng ban đầu. Nhưng để làm rõ hơn, tệp tin của nhánh staging có thể chứa "-r request / staging.txt" (hoặc tương tự), trong khi nhánh của nhánh prod có thể chứa "-r yêu cầu / prod.txt" (xem phần cuối câu trả lời của tôi). Đồng bộ nhánh thích hợp với phiên bản Heroku tương ứng của nó.
Christian Abbott

2
@SohamNavadiya Đó không phải là những gì tôi đã hỏi. Giả sử tôi có một base.txtvới 3 gói trong đó và dev.txtvới 1 gói trong đó (và -r base.txt). TẤT CẢ 4 gói được cài đặt trong môi trường ảo của tôi. Bây giờ tôi muốn cài đặt gói thứ 5 và liệt kê nó trong cơ sở, KHÔNG phải trong nhà phát triển, làm thế nào để làm điều đó? Chắc chắn, tôi có thể cài đặt nó pip freeze > base.txtnhưng điều đó KHÔNG giải quyết được vấn đề. Sau đó, nó đặt sự phụ thuộc của nhà phát triển thứ 4 vào cơ sở mà tôi không muốn.
Manan Mehta

10

Một lựa chọn khả thi ngày nay không tồn tại khi câu hỏi và câu trả lời ban đầu được đăng là sử dụng pipenv thay vì pip để quản lý các phần phụ thuộc.

Với pipenv, việc quản lý thủ công hai tệp yêu cầu riêng biệt như với pip không còn cần thiết nữa và thay vào đó, pipenv tự quản lý các gói phát triển và sản xuất thông qua các tương tác trên dòng lệnh.

Để cài đặt một gói để sử dụng trong cả sản xuất và phát triển:

pipenv install <package>

Để cài đặt một gói chỉ dành cho môi trường phát triển:

pipenv install <package> --dev

Thông qua các lệnh đó, pipenv lưu trữ và quản lý cấu hình môi trường trong hai tệp (Pipfile và Pipfile.lock). Buildpack Python hiện tại của Heroku nguyên bản hỗ trợ pipenv và sẽ tự định cấu hình từ Pipfile.lock nếu nó tồn tại thay vì request.txt.

Xem liên kết pipenv để có tài liệu đầy đủ về công cụ.


4
pipenv là một sự lãng phí thời gian. Quá trình khóa mất quá nhiều thời gian.
nurettin

9
pipenv bị hỏng ở hầu hết các khía cạnh. Nó hứa hẹn rất nhiều, nhưng xuất
xưởng

4
@ospider Sử dụng pipenv hàng ngày và tôi không gặp phải các vấn đề tiêu cực như bạn và nurettin đang báo cáo. Làm việc với phiên bản pipenv 2018.10.13. Vỡ mọi khía cạnh do đó là một tuyên bố rất trống rỗng.
Kwuite

1
@Kwuite Tôi chia sẻ cảm xúc của câu cuối cùng của bạn. Có rất ít cuộc đối thoại để tham gia khi một nhận xét là quan trọng nhưng bị bỏ trống.
Christian Abbott

3
Đồng ý với nurettin và ospider. pipenv thật tệ.
Andrew Palmer,

3

Nếu yêu cầu của bạn là có thể chuyển đổi giữa các môi trường trên cùng một máy, có thể cần tạo các thư mục virtualenv khác nhau cho từng môi trường bạn cần chuyển sang.

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.