pip version specifier의 거동을 확인하려면

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 종류의 비교 연산자를 사용할 수 있습니다.
  • ~= : Compatible release clause
  • == : Version matching clause
  • != : Version exclusion clause
  • <= , >= : Inclusive ordered comparison clause
  • < , > : Exclusive ordered comparison clause
  • === : Arbitrary equality clause.



  • 이 version 가 이 specifier 에 매치 하는지 문제



    음, 문제입니다. == 0.18.10.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
    ------------------------------
    

    공식에 대한 링크



  • 문서 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점을 양립할 수 있습니다.

    좋은 웹페이지 즐겨찾기