모든 개인 패키지를 한 곳에서 액세스 할 수 있도록하십시오
이 github 호스팅 된 PYPI 지수로
설명 • 시도하십시오! • 시작하기 • 색인 패키지 수정 • FAQ • 공급망 공격에 관한 단어 • 기여 • 참조
이 저장소는 PIPI 지수로 사용되는 GitHub 페이지이며 PEP503을 준수합니다.
이를 사용하여 모든 패키지를 한 곳으로 그룹화하고 공개적으로 사용 가능한 다른 패키지와 마찬가지로 pip 통해 쉽게 액세스 할 수 있습니다!
PYPI 지수는 공개적이지만 여기에 인덱싱 된 개인 패키지는 비공개로 유지됩니다. 검색하려면 Github 인증이 필요합니다.
astariul.github.io/github-hosted-pypi/를 방문하여 인덱스 된 패키지를 설치하십시오!
PACKET public-hello 설치하십시오.
pip install public-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/ 또한 패키지 mydependency 자동으로 설치합니다!
시도해보십시오 :
from public_hello import hi
print ( hi ())특정 버전을 설치할 수도 있습니다.
pip install public-hello==0.1 --extra-index-url https://astariul.github.io/github-hosted-pypi/ 이제 패키지 private-hello 설치하십시오.
pip install private-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/그것은 개인적이고 나만이 접근 할 수 있기 때문에 작동하지 않을 것입니다!
Settings 으로 이동하여 GitHub 페이지를 활성화하십시오.index.html 및 pkg_template.html 사용자 정의하십시오<user>.github.io/<repo_name> 을 방문하십시오 PYPI 인덱스가 설정되었으므로 인덱스 된 패키지를 등록 / 업데이트 / 삭제할 수 있습니다.
GitHub 작업은 자동으로 수행하도록 설정됩니다.
당신은 그냥해야합니다.
Actions 탭으로 이동하십시오register / update / delete )를 클릭하고 수동으로 트리거합니다. 아시다시피, pip pip install git+<repo_link> 양식에 주어진 경우 github-hosted 패키지를 설치할 수 있습니다. 이 PYPI 인덱스는 다른 GitHub 저장소에 대한 링크 색인 일뿐입니다.
GitHub 페이지는 공개적 이므로이 PYPI 인덱스는 공개됩니다. 그러나 다른 GitHub 리포지토리에 대한 링크 만 포함되어 있으며이 PYPI 인덱스에는 코드가 호스팅되지 않습니다!
리포지토리 호스팅 코드가 비공개 인 경우 GitHub로 인증하여 복제 할 수 있도록 효과적으로 비공개로 만들어야합니다.
공급망 공격에 대해 더 구체적으로 궁금하다면 섹션을 확인하십시오!
pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/
pip 기본적으로 공개 인덱스 인 https://pypi.org/ 살펴보고 지정된 이름의 패키지를 찾으려고합니다.https://astariul.github.io/github-hosted-pypi/ 를 살펴 봅니다.pip ( git+<repo_link>@<tag> )로 반환됩니다.pip 그것이 Github 리포지토리임을 이해하고 로컬로 리포지토리 (특정 태그에서)를 복제합니다.pip 패키지를 설치하십시오.pip 동일한 단계로 누락 된 종속성을 설치하십시오.인증은 저장소를 복제 할 때 4 단계에서 발생합니다.
단일 모범 사례는 Github 릴리스를 사용하는 것입니다. 이렇게하면 패키지에 특정 태그가 참조하는 버전을 가질 수 있습니다.
이것을하기 위해 :
pip install git+<repo_link>@<tag> 로 패키지를 설치할 수 있는지 확인하십시오.git+<repo_link>@<tag> )를 넣으십시오. 인덱스 된 패키지의 다른 이름 만 지정할 수 있습니다. 등록 할 때 양식의 다른 이름을 알려주십시오.
예를 들어 tensorflow 라는 개인 패키지가있는 경우이 색인에 등록하면 my_cool_tensorflow 를 지명 할 수 있으므로 공개 패키지 tensorflow 와 함께 이름-컬링이 없습니다.
그런 다음 pip install my_cool_tensorflow --extra-index-url https://astariul.github.io/github-hosted-pypi/ 로 설치할 수 있습니다.
그런 다음 python 에서 할 수 있습니다.
import tensorflow그러나 이것에 대해주의하십시오! 이와 같이 처리 할 수는 있지만 혼란을 피하고 보안을 위해 패키지의 고유 한 이름을 갖는 것이 항상 좋습니다!
Docker 이미지를 구축하는 것은 대화식이 아니므로 사용자 이름과 비밀번호를 입력 할 프롬프트가 없습니다.
대신, github 자격 증명을 .netrc 파일에 넣어야하므로 pip GitHub에서 클로닝 할 때 인증 할 수 있습니다.
Docker에서이를 안전하게 수행하려면 Docker 비밀을 사용해야합니다. 다음은 방법에 대한 빠른 자습서입니다.
1 단계 : 비밀 파일에 자격 증명을 저장하십시오. 이 예를 따르십시오 :
machine github.com
login <gh_user>
password <gh_pass>
n 입니다.
따라서 탭을 공백으로 대체하는 IDE를 사용하거나 Windows에있는 경우 (선 엔딩이 rn 인 경우)주의하십시오!
이 파일을 gh_auth.txt 로 지정해 봅시다.
2 단계 : Docker 파일을 만듭니다. Docker 파일에서 비밀 파일을 .netrc 에 장착하고 인증이 필요한 명령을 실행해야합니다. 예를 들어 :
# syntax=docker/dockerfile:experimental
FROM python:3
RUN --mount=type=secret,id=gh_auth,dst=/root/.netrc pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/3 단계 : 1 단계에서 생성 된 비밀의 위치를 지정하여 Docker Image를 작성하십시오.
sudo DOCKER_BUILDKIT=1 docker build --secret id=gh_auth,src=./gh_auth.txt .
이 FAQ를 개선하기위한 질문이나 아이디어가 있으면 PR / Blank 문제를여십시오!
앞에서 보았 듯이이 Github 호스팅 된 PYPI 인덱스는 pip 기능 --extra-index-url 에 의존합니다. 이 기능의 작동 방식으로 인해 공급망 공격에 취약합니다.
예를 들어, 개인 PYPI 인덱스에서 호스팅 된 fbi_package 버전 2.8.3 이라는 패키지가 있다고 가정 해 봅시다.
공격자는 동일한 이름과 더 높은 버전 (예 : 99.0.0 )의 악성 패키지를 만들 수 있습니다.
pip install fbi_package --extra-index-url my_pypi_index.com 에서 Hood pip 에서 최신 버전의 패키지를 다운로드합니다.
이 저장소는 자신의 PYPI 인덱스를 갖는 것이 매우 편리하지만 페이지가 공개적이라는 점에 유의하십시오. 따라서 누구나 사용하는 패키지 이름을 확인하고 동일한 이름의 악성 패키지를 만들 수 있습니다 ...
그렇기 때문에 우리는이 개인 PYPI 지수에 자동 확인을 포함 시켰습니다. 패키지 페이지에 액세스 할 때마다 PYPI API가 호출되고 동일한 이름과 더 높은 버전의 패키지가 발견되면 설치 명령이 경고로 바뀝니다.
https://astariul.github.io/github-hosted-pypi/transformers/에서 그러한 경고의 데모를 볼 수 있습니다.
이 경고가 표시되면 패키지를 설치하지 마십시오! 대신 패키지 이름을 변경하거나 공개 대응 버전을 업그레이드하십시오.
조심하세요!
문제와 PR을 환영합니다!
이상한 / 개선 될 수있는 이상한 것을 발견하면 연락하십시오!
이것은이 저장소에서 큰 영감을 받았습니다.
인덱스에서 패키지를 쉽게 추가, 업데이트 및 제거하기 위해 클리너 페이지와 GitHub 작업이 포함 된 영광스러운 버전 일뿐입니다.
또한 원래 저자의 블로그 포스트를 확인하십시오!
페이지에 사용 된 아이콘은 Flaticon의 Freepik에 의해 만들어졌습니다.