Tại sao lại đặt các phụ thuộc cần thiết của bạn ở nhiều vị trí khi một vị trí là đủ? . py
Trăn đá Bắc Phi cái [Python sebae] ấp trứng tại Tropicario — The Tropical Animal House, Helsinki, Phần Lan. Được cấp phép theo CC BY-SA 3. 0
include Pipfile
2import tomldef get_install_requirements[]:
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
Bạn cũng sẽ cần thêm
include Pipfile
3 vào include Pipfile
4 của mình để xây dựng include Pipfile
5include Pipfile
6include Pipfile
NềnPhụ thuộc rất khó và có rất nhiều ý tưởng về cách xử lý chúng. Đặc biệt, các thư viện khác với các ứng dụng về cách xử lý các gói yêu cầu. Bài viết này đề xuất một giải pháp cho cả thư viện và ứng dụng. Chúng tôi sẽ sử dụng tiêu chuẩn
include Pipfile
7 để xây dựng thư viện Python và include Pipfile
8 để quản lý các phụ thuộc. Bằng cách sử dụng include Pipfile
9, chúng tôi có thể chỉ định cách tiếp cận chi tiết cho các phiên bản phụ thuộc, nhưng chúng tôi cũng có thể thoải mái hơn và cho phép phiên bản phụ thuộc mới nhất trong khi tạo lại môi trường làm việc nhờ vào include Pipfile
10Quản lý yêu cầu thư việnCác phần phụ thuộc thư viện Python, còn được gọi là phần phụ thuộc trừu tượng, thường không ghim vào một phiên bản cụ thể [là bản ghi tuyệt vời] trong
include Pipfile
7. Các phụ thuộc trừu tượng này phải tương thích với các thư viện khác và bằng cách ghim chúng vào một phiên bản cụ thể, bạn có thể tạo ra tình huống trong đó các thư viện chia sẻ các phụ thuộc trở nên không tương thích với nhau. Một ví dụ include Pipfile
7 có thể như sauthành lập. py
include Pipfile
1Bạn có thể đặt các yêu cầu trong
include Pipfile
7 như đã trình bày ở trên, nhưng bạn cũng cần giữ các yêu cầu này trong tệp include Pipfile
14 include Pipfile
15 để thiết lập môi trường thử nghiệm và phát triểnpipenv thay vì pipinclude Pipfile
9 là một sự phát triển của include Pipfile
14 cài đặt các gói, quản lý cả phụ thuộc trực tiếp và chuyển tiếp và quản lý môi trường ảo. Pipenv giải quyết vấn đề khó chịu về sự phụ thuộc của các phần phụ thuộc của bạn — các gói không được liệt kê trực tiếp trong include Pipfile
3 của bạn—được cài đặt ở các phiên bản khác nhau giữa các bản dựng ngay cả khi mã của bạn không thay đổi. Vì lý do này và những lý do khác không được thảo luận trong blog này, chúng tôi quyết định sử dụng include Pipfile
9Không ai muốn quản lý các phụ thuộc trong nhiều tệpXem xét kịch bản này
Tôi là nhà phát triển đang xây dựng thư viện tuyệt vời tiếp theo, my-awesome-library. Tôi hiện đang sử dụng
include Pipfile
9 để cung cấp môi trường dành cho nhà phát triển của mình. Khi tôi cần một gói mới để phát triển, tôi thêm nó vào include Pipfile
3 của mình và tiếp tục công việc hàng ngày của mình. Điều này theo dõi các phụ thuộc của tôi cho tôi và thậm chí bảo vệ tôi khỏi các phụ thuộc bắc cầu khó chịu. Những phần phụ thuộc này đã được nâng cấp bên dưới tôi trước đây và đã phá vỡ hoàn toàn thư viện tuyệt vời của tôi. Rất may, include Pipfile
10 đã ngăn chặn điều này cho đến khi tôi sẵn sàng cập nhật các thư viện này. Vấn đề ở đây là tất cả các phụ thuộc của tôi hiện được lưu trữ trong include Pipfile
3 của tôi. Tôi cần thêm một phần vào include Pipfile
7 của mình có tên là include Pipfile
1 để chỉ định những phần phụ thuộc bên ngoài mà thư viện của tôi có. Tôi giải quyết điều này như thế nào?Yêu cầu
- Tôi muốn có một tệp duy nhất để quản lý các phụ thuộc của mình
- Tôi muốn có thể dễ dàng tạo một môi trường có cài đặt các phụ thuộc này
Duy trì các phụ thuộc của tôi trong cả
import tomldef get_install_requirements[]:86 và
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
include Pipfile
2Đây có lẽ là cách triển khai phổ biến nhất. Không có gì đặc biệt sai với việc triển khai này, ngoại trừ các phần phụ thuộc của tôi được phân chia giữa hai tệp
Bạn có thể gặp lỗi nếu chỉ định một phiên bản cụ thể trong
include Pipfile
3 của mìnhimport tomldef get_install_requirements[]:86
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
import tomldef get_install_requirements[]:8
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
…và sau đó chỉ định một phạm vi trong
include Pipfile
7 của bạn không tương thíchinclude Pipfile
2 với phạm vi gói được xác địnhinclude Pipfile
5Nếu bạn chạy một
include Pipfile
52 để thử nghiệm gói cục bộ, điều này sẽ gây ra một lỗi không quá khó để sửa, nhưng có thể sẽ gây ra một số lời tục tĩu ngắn gọn. Mục tiêu của chúng ta là tránh xích mích đóĐã thử Giải pháp 2 — Bị từ chốiYêu cầu
import tomldef get_install_requirements[]:86 của tôi cài đặt các gói phụ thuộc của gói của tôi bằng cách cài đặt chính thư viện tuyệt vời của tôi
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
Với
include Pipfile
9, có thể cài đặt thư viện mà bạn đang làm việc nhằm cố gắng cài đặt các phần phụ thuộc của thư việnimport tomldef get_install_requirements[]:86 với cài đặt có thể chỉnh sửa
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
include Pipfile
0Điều này có thể hoạt động, nhưng tôi đã gặp phải sự phụ thuộc vòng tròn cài đặt con gà và quả trứng [cố gắng cài đặt một gói mà tôi yêu cầu nhập trong quá trình thiết lập của mình. py]
include Pipfile
2 với include Pipfile
57include Pipfile
3Với một
include Pipfile
7 như thế này, include Pipfile
9 cố gắng cài đặt my-awesome-library, nhưng để chạy gói, nó cần có include Pipfile
00, chưa được cài đặt. Nhưng chúng tôi không thể chạy include Pipfile
7 để cài đặt mà không có include Pipfile
00. Thiết lập này có thể dẫn đến đau lòng theo số lượng [điểm thưởng nếu bạn nhận được tham chiếu đó]. Nếu bạn không thực hiện bất kỳ loại xử lý nào trong include Pipfile
7 yêu cầu thư viện bên ngoài, thì phương pháp này có thể được chấp nhận. Nhưng ngay sau khi bạn thêm một phụ thuộc bên ngoài, tất cả các cược sẽ bị tắtQuan trọng hơn, tôi vẫn đang quản lý hai tệp cho tất cả các phụ thuộc của mình và điều đó sẽ không xảy ra
Đã thử Giải pháp 3 — Được chấp nhậnChỉ có các phụ thuộc trong
import tomldef get_install_requirements[]:86 của tôi và đọc chúng trong
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
include Pipfile
2 của tôi khi xây dựngVới giải pháp này, chúng ta phải thực thi các tiêu chuẩn này
- Chỉ các gói phụ thuộc trực tiếp vào thư viện mới được đặt trong phần
include Pipfile
06 củainclude Pipfile
3 - Bất kỳ gói, công cụ, thư viện nào khác mà chúng tôi cần để phát triển được đặt trong phần
include Pipfile
08 củainclude Pipfile
3
Bằng cách thêm đoạn mã sau vào
include Pipfile
7 của bạn, đối số từ khóa include Pipfile
1 được điền khi tệp được thực thi [i. e. , lúc xây dựng, lúc cài đặt cục bộ]include Pipfile
2include Pipfile
9Bằng cách này, chúng tôi có thể chỉ định tất cả các phụ thuộc của mình trong
include Pipfile
3, bao gồm các phiên bản và phạm vi cụ thể. Nếu không có phiên bản nào được chỉ định [_______434 trong include Pipfile
3] thì sẽ không có phiên bản nào được chỉ định trong include Pipfile
1import tomldef get_install_requirements[]:86
try:
# read my pipfile
with open ['Pipfile', 'r'] as fh:
pipfile = fh.read[]
# parse the toml
pipfile_toml = toml.loads[pipfile]
except FileNotFoundError:
return []# if the package's key isn't there then just return an empty list
try:
required_packages = pipfile_toml['packages'].items[]
except KeyError:
return []
# If a version/range is specified in the Pipfile honor it
# otherwise just list the package
return ["{0}{1}".format[pkg,ver] if ver != "*"
else pkg for pkg,ver in required_packages]setup[
# other keyword arguments omitted
install_requires = get_install_requirements[],
]
include Pipfile
5Bạn cũng sẽ cần thêm
include Pipfile
3 vào include Pipfile
4 của mình để xây dựng include Pipfile
5include Pipfile
91include Pipfile
Bây giờ bạn có một tệp duy nhất chứa các phụ thuộc thư viện của bạn cũng có thể được sử dụng để tạo môi trường phát triển
Nếu bạn cần các gói khác để phát triển, thử nghiệm hoặc linting, bạn có thể thêm chúng vào phần
include Pipfile
92gói phát triển
include Pipfile
0Kết luậnMột nguồn sự thật duy nhất để quản lý các dự án Python của chúng tôi đã làm cho quá trình phát triển trở nên suôn sẻ hơn rõ rệt. Việc sử dụng
include Pipfile
9 vẫn cho phép chúng tôi xác định và đảm bảo cùng một phiên bản thư viện được cài đặt mỗi lần. Và vì chúng tôi lưu trữ include Pipfile
10 trong kiểm soát phiên bản, nên rất dễ dàng quay lại phiên bản trước nếu sự phụ thuộc leo thang cái đầu xấu xí của nó. Tôi không còn phải lo lắng về các gói phụ thuộc và có thể tập trung toàn bộ sự chú ý vào mã của mình. Đó là cách nó nên được