pip version specifier의 거동을 확인하려면
6035 단어 버전파이썬pipsemverPackageManagement
TL; DR
>>> from packaging.specifiers import SpecifierSet
>>> '0.18.1.0' in SpecifierSet('== 0.18.1')
True
pip version specifier
pip
에는, npm 와 같은 다른 패키지 매니저와 같이, 버젼을 유연하게 지정하기 위한 구조가 있습니다.
가장 자주 사용되는 것은 ==
입니까?
pip install flake8-import-order==0.18
이 외에도 아래의 6 종류의 비교 연산자를 사용할 수 있습니다.
>>> from packaging.specifiers import SpecifierSet
>>> '0.18.1.0' in SpecifierSet('== 0.18.1')
True
pip
에는, npm 와 같은 다른 패키지 매니저와 같이, 버젼을 유연하게 지정하기 위한 구조가 있습니다.가장 자주 사용되는 것은
==
입니까?pip install flake8-import-order==0.18
이 외에도 아래의 6 종류의 비교 연산자를 사용할 수 있습니다.
~=
: Compatible release clause ==
: Version matching clause !=
: Version exclusion clause <=
, >=
: Inclusive ordered comparison clause <
, >
: Exclusive ordered comparison clause ===
: Arbitrary equality clause. 이 version 가 이 specifier 에 매치 하는지 문제
음, 문제입니다. == 0.18.1
는 0.18.1.0
와 일치합니까? === 0.18.1
그렇다면? ~= 0.18.1
그렇다면?
상세한 사양은 상기 문서에 기재되어 있습니다만, 세세한 거동이 비교적 복잡하고, 의외로 순조롭게는 이해하기 어렵습니다(본 기사의 목적으로부터 벗어나므로 해설은 하지 않습니다).
그럴 때는 pip
가 사용하고 있는 pypa/packaging 을 그대로 사용합시다!
>>> from packaging.specifiers import SpecifierSet
>>> '0.18.1.0' in SpecifierSet('== 0.18.1')
True
>>> for spec in ['== 0.18.1', '== 0.18.*', '~= 0.18.1', '=== 0.18.1']:
... for version in ['0.18.0', '0.18.1', '0.18.1.0', '0.18.2', '0.19']:
... match = version in SpecifierSet(spec)
... print('{:10s}{:10s} ... {}'.format(version, spec, match))
... print('-' * 30)
...
0.18.0 == 0.18.1 ... False
0.18.1 == 0.18.1 ... True
0.18.1.0 == 0.18.1 ... True
0.18.2 == 0.18.1 ... False
0.19 == 0.18.1 ... False
------------------------------
0.18.0 == 0.18.* ... True
0.18.1 == 0.18.* ... True
0.18.1.0 == 0.18.* ... True
0.18.2 == 0.18.* ... True
0.19 == 0.18.* ... False
------------------------------
0.18.0 ~= 0.18.1 ... False
0.18.1 ~= 0.18.1 ... True
0.18.1.0 ~= 0.18.1 ... True
0.18.2 ~= 0.18.1 ... True
0.19 ~= 0.18.1 ... False
------------------------------
0.18.0 === 0.18.1 ... False
0.18.1 === 0.18.1 ... True
0.18.1.0 === 0.18.1 ... False
0.18.2 === 0.18.1 ... False
0.19 === 0.18.1 ... False
------------------------------
공식에 대한 링크
>>> from packaging.specifiers import SpecifierSet
>>> '0.18.1.0' in SpecifierSet('== 0.18.1')
True
>>> for spec in ['== 0.18.1', '== 0.18.*', '~= 0.18.1', '=== 0.18.1']:
... for version in ['0.18.0', '0.18.1', '0.18.1.0', '0.18.2', '0.19']:
... match = version in SpecifierSet(spec)
... print('{:10s}{:10s} ... {}'.format(version, spec, match))
... print('-' * 30)
...
0.18.0 == 0.18.1 ... False
0.18.1 == 0.18.1 ... True
0.18.1.0 == 0.18.1 ... True
0.18.2 == 0.18.1 ... False
0.19 == 0.18.1 ... False
------------------------------
0.18.0 == 0.18.* ... True
0.18.1 == 0.18.* ... True
0.18.1.0 == 0.18.* ... True
0.18.2 == 0.18.* ... True
0.19 == 0.18.* ... False
------------------------------
0.18.0 ~= 0.18.1 ... False
0.18.1 ~= 0.18.1 ... True
0.18.1.0 ~= 0.18.1 ... True
0.18.2 ~= 0.18.1 ... True
0.19 ~= 0.18.1 ... False
------------------------------
0.18.0 === 0.18.1 ... False
0.18.1 === 0.18.1 ... True
0.18.1.0 === 0.18.1 ... False
0.18.2 === 0.18.1 ... False
0.19 === 0.18.1 ... False
------------------------------
문서 htps : // 파 c 카긴 g. py 파. 이오 / 엔 / ㅁ st / s 페시 푸에 rs /
소스 코드 htps : // 기주 b. 이 m/py파/파c카긴g/bぉb/마s테r/파c카긴g/s페시후페에rs. py
~=을 사용합시다.
쓰고 싶은 것은 여기까지입니다만, 마지막으로 보충을 하나.
앞서 언급한 6종류 중에서는 ==
가 사용되기 쉽지만 공식적으로는 권장되지 않습니다.
The use of == (without at least the wildcard suffix) when defining dependencies for published distributions is strongly discouraged as it greatly complicates the deployment of security fixes.
졸업
==를 (적어도 와일드 카드없이) 공개 패키지에 사용하면 보안 수정 프로그램의 배포가 매우 번거롭습니다. 따라서 가능한 한 사용하지 않는 것이 좋습니다.
대신에 ~=
(compatible release operator) 를 사용하도록 합시다.
이것으로
의 2점을 양립할 수 있습니다.
Reference
이 문제에 관하여(pip version specifier의 거동을 확인하려면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tmshn/items/2fde5dcab21e0cedba0c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)