[[📒Articles]] > [[📒2021 Articles]] ![[2021-08-15.jpg|cover-picture]] [[JFrog Artifactory]]でプラむベヌトな[[PyPI]]リポゞトリを䜜り、パッケヌゞをpublishしたりInstallしたりしおみたした。 ## はじめに 本蚘事で登堎するタヌミナルの結果は[[Windows]]ず[[PowerShell]]を䜿っおいたす。別のOSを利甚しおいる堎合はコマンドを眮き換えおください。 たた、筆者はこの蚘事を執筆するずき、はじめお[[JFrog Platform]]を䜿いたした。実践経隓はなく、間違った情報を曞いおいるかもしれたせん。その堎合は[Twitter]などでフィヌドバックいただけるず倧倉助かりたす😄 [Twitter]: https://twitter.com/tadashi_maman ## [[JFrog Artifactory]]ずは [[JFrog Artifactory]]ずは[[JFrog Platform]]におけるナニバヌサルリポゞトリマネヌゞャのサヌビスです。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://speedmedia.jfrog.com/08612fe1-9391-4cf3-ac1a-6dd49c36b276/media.jfrog.com/wp-content/uploads/2019/04/20131046/Jfrog16-1.png" /> <span class="link-card-v2-site-name">JFrog</span> </div> <div class="link-card-v2-title"> Artifactory - ナニバヌサルアヌティファクト管理 </div> <div class="link-card-v2-content"> 䞖界初のナニバヌサルリポゞトリずしお、JFrog ArtifactoryはJFrog Platformのミッションクリティカルな䞭心郚であり、DevOpsパむプラむン党䜓を移動するすべおのパッケヌゞの信頌できる単䞀の゜ヌスず ... </div> <img src="https://media.jfrog.com/wp-content/uploads/2018/06/20132021/JFROG.png" class="link-card-v2-image"/> <a href="https://jfrog.com/ja/artifactory/"></a> </div> 䞻な特城は以䞋の通りです。 - プラむベヌトなパッケヌゞリポゞトリを䜜成/管理できる - パブリックなパッケヌゞリポゞトリぞのプロキシも䜜成/管理できる - 単䞀の[[URL]]で䞊蚘2぀を制埡できる 具䜓的には、[[Python]]の[[PyPI]]、[[Node.js]]の[[npm]]、[[Rust]]の[[Cargo]]みたいなリポゞトリの自分版を䜜るこずができたす。仕事などでPublicなパッケヌゞリポゞトリを䜿えないずきに䟿利です。 以䞋ではパッケヌゞリポゞトリのこずをリポゞトリず呌びたす。[[Git]]のリポゞトリではありたせんのでご泚意ください。 ## リポゞトリの䜜成 右䞊のドロップダりンメニュヌから`Quick Setup`を遞びたす。 ![[Pasted image 20210815121859.png]] [[Python]]なので[[PyPI]]を遞びたす。 ![[Pasted image 20210815122022.png]] 次にリポゞトリの名前を決めたす。`Quick Setup`では`Repositories prefix`を入力するず以䞋3぀のリポゞトリ名を自動で決定し䜜成しおくれたす。 - [[Localリポゞトリ]] - [[Remoteリポゞトリ]] - [[Virtualリポゞトリ]] これは[[Best practices for structuring and naming Artifactory repositories]]で玹介されおいる呜名のベストプラクティスに沿っおいたす。若干異なる郚分はありたすが抂ね同じです。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://speedmedia.jfrog.com/08612fe1-9391-4cf3-ac1a-6dd49c36b276/media.jfrog.com/wp-content/uploads/2019/04/20131046/Jfrog16-1.png" /> <span class="link-card-v2-site-name">JFrog</span> </div> <div class="link-card-v2-title"> Best Practices for Structuring and Naming Artifactory Repositories </div> <div class="link-card-v2-content"> Implement naming convensions for Artifactory repository types. Scale Artifactory across global topologies and su ... </div> <img class="link-card-v2-image" src="https://speedmedia.jfrog.com/08612fe1-9391-4cf3-ac1a-6dd49c36b276/media.jfrog.com/wp-content/uploads/2018/03/20132231/White_Paper.png" /> <a href="https://jfrog.com/whitepaper/best-practices-structuring-naming-artifactory-repositories/"></a> </div> ![[Pasted image 20210815123712.png]] これでリポゞトリが䜜成されたした。 ## パッケヌゞ甚の[[Python]]プロゞェクト 䜜成したリポゞトリにパッケヌゞをアップロヌドするため、その元になる[[Python]]プロゞェクトを䜜成しpackagingしたす。[[Poetry]]を䜿いたす。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://python-poetry.org/images/favicon-origami-32.png" /> <span class="link-card-v2-site-name">python-poetry.org</span> </div> <div class="link-card-v2-title"> Poetry - Python dependency management and packaging made easy </div> <div class="link-card-v2-content"> Python dependency management and packaging made easy </div> <a href="https://python-poetry.org/"></a> </div> ### プロゞェクト䜜成 ```console:poetryのバヌゞョン確認 $ poetry --version Poetry version 1.1.7 ``` ```console:プロゞェクト䜜成 $ poetry new library Created package library in library $ tree -a .\library\  ./library ├──  library │ └──  __init__.py ├──  pyproject.toml ├──  README.rst └──  tests ├──  __init__.py └──  test_library.py ``` ### 実装 適圓な`hello()`ずいう関数を実装したす。 ```python:library/__init__.py __version__ = '0.1.0' def hello(): print("Helooooooooooooooooooooooooooooooooooooowh!!") ``` 動䜜確認をしたす。 ```python $ poetry run python Creating virtualenv library-fI7uw2HO-py3.9 in C:\Users\tadashi-aikawa\AppData\Local\pypoetry\Cache\virtualenvs Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from library import hello >>> hello() Helooooooooooooooooooooooooooooooooooooowh!! ``` ### パッケヌゞング [[JFrog Artifactory]]にアップロヌドするためのパッケヌゞをビルドしたす。 ```console $ poetry build Building library (0.1.0) - Building sdist - Built library-0.1.0.tar.gz - Building wheel - Built library-0.1.0-py3-none-any.whl ``` これでラむブラリの準備ができたした。 ## [[JFrog Artifactory]]にPublish ### プラむベヌトリポゞトリの登録 Publishの前に[[Poetryでプラむベヌトリポゞトリを登録]]する必芁がありたす。ドキュメントに[[Poetry]]の䟋はありたせんが、リポゞトリURLさえ分かれば問題ありたせん。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://jfrog.com/favicon.ico" /> <span class="link-card-v2-site-name">jfrog.com</span> </div> <div class="link-card-v2-title"> PyPI Repositories </div> <div class="link-card-v2-content"> The JFrog Artifactory integration with the Python Package Index (PyPI) allows you to manage PyPI packages in Art ... </div> <a href="https://jfrog.com/help/r/jfrog-artifactory-documentation/pypi-repositories"></a> </div> `xxxxx`の[[JFrog Platform]]のサブドメむンによっお倉わりたす。 ```console poetry config --local repositories.mamansoft https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi ``` `--local`を倖せばグロヌバルに蚭定できたすが、開発者の環境によっお差異を出したくないため、このリポゞトリのみに蚭定したした。`poetry.toml`が䜜成されおいれば成功です。 ```toml:poetry.toml [repositories] [repositories.mamansoft] url = "https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi" ``` ドキュメントでは[[Localリポゞトリ]](`mamansoft-pypi-local`)を指定しおいたすが、ここでは[[Virtualリポゞトリ]]を蚭定しおいたす。その理由はあずで説明したす。 ### 認蚌情報の蚭定 あわせお認蚌情報も登録しおおきたしょう。以䞋のコマンドを実行したす。 ```console poetry config http-basic.mamansoft ナヌザヌ名 暗号化されたパスワヌド ``` ==⚠ [[JFrog Platform]]のログむンパスワヌドをそのたた䜿甚しないでください。==挏掩時の被害が倧きくなるためです。代わりに`Set Me Up`から暗号化された認蚌情報を取埗し、それを䜿っおください。 ![[Pasted image 20210815135127.png]] ![[Pasted image 20210815135231.png]] ![[Pasted image 20210815172138.png]] ### プラむベヌトリポゞトリにpublish リポゞトリ名を指定しお`publish`したす。 ```console $ poetry publish -r mamansoft Publishing library (0.1.0) to mamansoft - Uploading library-0.1.0-py3-none-any.whl 0% - Uploading library-0.1.0-py3-none-any.whl 100% - Uploading library-0.1.0-py3-none-any.whl 100% - Uploading library-0.1.0.tar.gz 0% - Uploading library-0.1.0.tar.gz 100% - Uploading library-0.1.0.tar.gz 100% ``` こんな颚に衚瀺されおいれば成功です。 ![[Pasted image 20210815133223.png]] ## [[JFrog Artifactory]]からむンストヌル Publishしたラむブラリをむンストヌルしお䜿っおみたしょう。䞻にラむブラリ開発に甚いる[[Poetry]]プロゞェクトず、プロダクション環境で甚いる[[Pip]]プロゞェクト、それぞれで詊したす。 ### [[Poetry]]プロゞェクトで䜿う プロゞェクトを䜜成したす。 ```console:プロゞェクト䜜成 $ poetry new use-poetry Created package use_poetry in use-poetry $ tree -a .\use-poetry\  ./use-poetry ├──  pyproject.toml ├──  README.rst ├──  tests │ ├──  __init__.py │ └──  test_use_poetry.py └──  use_poetry └──  __init__.py ``` むンストヌルしたす。 ```console:libraryをむンストヌル $ poetry add library Creating virtualenv use-poetry-BM2Yz1-r-py3.9 in C:\Users\tadashi-aikawa\AppData\Local\pypoetry\Cache\virtualenvs Using version ^0.0.0 for Library Updating dependencies Resolving dependencies... Writing lock file Package operations: 11 installs, 0 updates, 0 removals • Installing pyparsing (2.4.7) • Installing atomicwrites (1.4.0) • Installing attrs (21.2.0) • Installing colorama (0.4.4) • Installing more-itertools (8.8.0) • Installing packaging (21.0) • Installing pluggy (0.13.1) • Installing py (1.10.0) • Installing wcwidth (0.2.5) • Installing library (0.0.0) • Installing pytest (5.4.3) ``` 䞀芋成功しおいるように芋えたすがそうではありたせん。これはパブリック[[PyPI]]にpublishされおいる同名の異なるラむブラリです。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://pypi.org/favicon.ico" /> <span class="link-card-v2-site-name">pypi.org</span> </div> <div class="link-card-v2-title"> Client Challenge </div> <a href="https://pypi.org/project/Library/"></a> </div> ぀たり、今回䜜成したプラむベヌトリポゞトリを参照しおいなかったずいうこずです。[[Poetryでプラむベヌトリポゞトリから新しいpackageをむンストヌル]]するには`pyproject.toml`に蚭定が必芁です。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://python-poetry.org/images/favicon-origami-32.png" /> <span class="link-card-v2-site-name">python-poetry.org</span> </div> <div class="link-card-v2-title"> Repositories | Documentation | Poetry - Python dependency management and packaging made easy </div> <div class="link-card-v2-content"> RepositoriesPoetry supports the use of PyPI and private repositories for discovery ofpackages as well as for pub ... </div> <a href="https://python-poetry.org/docs/repositories/#install-dependencies-from-a-private-repository"></a> </div> たずは先ほどむンストヌルしたものを削陀したす。 ```console:libraryの削陀 $ poetry remove library Updating dependencies Resolving dependencies... Writing lock file Package operations: 0 installs, 0 updates, 1 removal • Removing library (0.0.0) ``` 以䞋の蚭定を远加したす。 ```toml:pyproject.toml [[tool.poetry.source]] name = "mamansoft" url = "https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/simple" ``` もう䞀床むンストヌルしおみたしょう。 ```console:libraryをむンストヌル $ poetry add library Using version ^0.1.0 for library Updating dependencies Resolving dependencies... Writing lock file Package operations: 1 install, 0 updates, 0 removals • Installing library (0.1.0) ``` 今床はちゃんずむンストヌルされたした。ちゃんず動䜜したす。 ```python $ poetry run python Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from library import hello >>> hello() Helooooooooooooooooooooooooooooooooooooowh!! ``` もちろんプラむベヌトリポゞトリに存圚しなければ、パブリック[[PyPI]]のパッケヌゞをむンストヌルできたす。 ```console $ poetry add owlmixin Using version ^5.6.1 for owlmixin Updating dependencies Resolving dependencies... Writing lock file Package operations: 2 installs, 0 updates, 0 removals • Installing pyyaml (5.4.1) • Installing owlmixin (5.6.1) ``` ### [[Pip]]プロゞェクトで䜿う 先ほど䜜成した[[Poetry]]のプロゞェクトにお、[[Poetryでrequirements.txtを䜜成]]したす。 ```console poetry export -f requirements.txt -o requirements.txt ``` [[requirements.txt]]ができたす。埌半の`--hash`は省略しおいたす。 ```txt:requirements.txt --extra-index-url https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/simple library==0.1.0; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:20d2738a62309c429252014a49c246969b4e3c407a4b72f374b8853ab903c854 \ --hash=sha256:76042c9a2092832ee0f353ce389c120357eaac2a397597032978c753eef281e2 owlmixin==5.6.1; python_version >= "3.6" and python_version < "4.0" \ --hash=sha256:3379cbc8215040ac45e30534c8d83626b560500c94521cfcd2eab5eea7c12f88 pyyaml==5.4.1; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.0" \ --hash=sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922 \ --hash=sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393 \ . . ``` 䞀匏を別の堎所にコピヌしたす。 ```console:プロゞェクトのコピヌ cp -r use-poetry use-pip ``` [[仮想環境を䜜成 (Python)|仮想環境を䜜成]]し、Activateしたす。 ```console $ cd use-pip $ python3 -m venv venv $ .\venv\Scripts\activate ``` [[Pip]]では[[pyproject.toml]]を参照しないため、このたたむンストヌルコマンドを実行するず認蚌情報を尋ねられたす。手元の操䜜には問題ありたせんが、CIなどを行うずきに䞍䟿です。 [[JFrog Platform]]の`Set Me Up`を芋るず`~/.pip/pip.conf`に蚭定する方法が玹介されおいたす。 ![[Pasted image 20210815172257.png]] [[Windows]]の堎合は`%APPDATA%\pip\pip.ini`[^2]になりたす。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://pip.pypa.io/favicon.ico" /> <span class="link-card-v2-site-name">pip.pypa.io</span> </div> <div class="link-card-v2-title"> Configuration - pip documentation v25.1.1 </div> <a href="https://pip.pypa.io/en/stable/topics/configuration/"></a> </div> ```ini:%APPDATA%\pip\pip.ini [global] index-url = https://tadashi-aikawa:暗号化されたパスワヌド@xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/simple ``` これでむンストヌルしたす。 ```console $ pip install -r requirements.txt pip install -r .\requirements.txt Looking in indexes: https://tadashi-aikawa:****@xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/simple, https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/simple Collecting library==0.1.0 Downloading https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/library/0.1.0/library-0.1.0-py3-none-any.whl (1.1 kB) Collecting owlmixin==5.6.1 Downloading https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/packages/packages/35/c2/ffb7514eb16745089896b5a83777686cd5470dd229db89a57ce1bd8d9bef/owlmixin-5.6.1-py3-none-any.whl (20 kB) Collecting pyyaml==5.4.1 Downloading https://xxxxx.jfrog.io/artifactory/api/pypi/mamansoft-pypi/packages/packages/bd/cb/9a65a8a852868ebfb7f6e631c2c0bf7e39c9f7a757ee329078a35534fc5b/PyYAML-5.4.1-cp39-cp39-win_amd64.whl (213 kB) |████████████████████████████████| 213 kB 819 kB/s Installing collected packages: pyyaml, owlmixin, library Successfully installed library-0.1.0 owlmixin-5.6.1 pyyaml-5.4.1 ``` ## 3぀のリポゞトリず[[Virtualリポゞトリ]] これでやりたかったこずは党おできたした。しかし、以䞋の点で腑に萜ちない郚分があるのではないでしょうか。 - [[Virtualリポゞトリ]]のリポゞトリURLしか䜿っおいない - パブリックずプラむベヌトのリポゞトリをどう制埡しおいるのか 冒頭でもリストアップした以䞋3぀のリポゞトリの関係性をもう䞀床敎理しおみたしょう。 | リポゞトリの皮類 | 抂芁 | | --------------------- | ---------------------------------- | | [[Localリポゞトリ]] | プラむベヌトリポゞトリの実䜓 | | [[Remoteリポゞトリ]] | 別リポゞトリぞのキャッシュプロキシ | | [[Virtualリポゞトリ]] | [[リバヌスプロキシ]]のようなもの | 今回の蚘事に関係する登堎人物ずフロヌ[^1]は以䞋の通りです。今回リモヌトリポゞトリはパブリック[[PyPI]]を参照しおいるためそのようになっおいたすが、蚭定によっおはその限りではありたせん。 ![[jfrog-3repositories.png]] ### [[Virtualリポゞトリ]]の蚭定 たずは[[Virtualリポゞトリ]]の蚭定を確認したす。 ![[Pasted image 20210815183108.png]] `Set Me Up`から蚭定するず[[Virtualリポゞトリ]]にデフォルトで気の利く蚭定がされおいるわけです。凄いですね ![[Pasted image 20210815183616.png]] ### Publishのフロヌ 先ほどの図ず照らし合わるず、Publishの堎合は ==⑥ → ② → ①== ずいうフロヌで[[Localリポゞトリ]]に登録されたす。 ![[jfrog-3repositories.png]] ### むンストヌルのフロヌ むンストヌルの堎合は少し耇雑です。 1. ==⑥ → ②== のフロヌで[[Localリポゞトリ]]に察象パッケヌゞがあるか確認 - ある堎合は2ぞ - ない堎合は3ぞ 2. ==① → ② → ⑥== のフロヌで察象パッケヌゞを返华しお 🔚**終了**🔚 3. ==③ → ④== のフロヌで[[Remoteリポゞトリ]]のキャッシュに察象パッケヌゞがあるか確認 - ある堎合は4ぞ - ない堎合は5ぞ 4. ==④ → ③ → ⑥== のフロヌでキャッシュから察象パッケヌゞを返华しお 🔚**終了**🔚 5. ==â‘€ → ④== のフロヌで察象パッケヌゞを取埗しおキャッシュに保存 6. ==④ → ③ → ⑥== のフロヌで察象パッケヌゞを返华しお🔚**終了**🔚 簡単に蚀うず以䞋の順番に探しにいっおいるだけです。 1. [[Localリポゞトリ]] 2. [[Remoteリポゞトリ]] (キャッシュ) 3. [[Remoteリポゞトリ]] (ノヌキャッシュ) ### [[Virtualリポゞトリ]]だけを䜿うワケ 以䞊のフロヌから、クラむアントは==⑥==ずのやりずり==だけ==で目的(Publish/むンストヌル)を果たせおいるこずが分かりたした。これは**[[Virtualリポゞトリ]]ずのやりずり==だけ==で目的を果たせる**ずいうこずです。 もちろん、[[Localリポゞトリ]]や[[Remoteリポゞトリ]]を盎接指定しおやりずりするこずも可胜です。しかし、[[Best practices for structuring and naming Artifactory repositories]]でも蚀及されおいるずおり、特別な理由がなければ[[Virtualリポゞトリ]]==だけ==ずのやりずりを行ったほうがいいでしょう。 > In general, its best practice that all consumption and writes are done through virtual repositories, as opposed to local/remote repositories. This is so that as many implementation details as possible can be omitted, letting the users work with a single, well-known URL. Additionally, while for local repositories maturity is strictly about artifact stages, for virtual repositories you may consider the audience more. すべおのやりずりを単䞀の゚ンドポむントで行うこずにより、耇雑な実装を健党な圢で隠蔜しシンプルなむンタフェヌスを提䟛できるからです。そのような考えにどのようなメリットがあるか..はここで説明するたでもないでしょう。 ## たずめ [[JFrog Artifactory]]でプラむベヌトな[[PyPI]]リポゞトリを䜜り、パッケヌゞをpublish/むンストヌルしおみたした。たた、[[Virtualリポゞトリ]]の䜿い方や[[JFrog]]で提唱されおいるベストプラクティスに぀いおも觊れたした。 OSSで利甚する分にはパブリックなリポゞトリで十分なため、必芁になるこずは少ないでしょう。しかし、仕事のようにクロヌズドな環境でラむブラリの開発/管理が必芁になった堎合だず話は倉わりたす。 [[Git]]を䜿ったり、独自[[パッケヌゞマネヌゞャヌ]]を開発したり、手順曞やスクリプトで乗り切るこずができるかもしれたせん。しかし、品質の芁ずなるパッケヌゞ管理を蔑ろにするず、プロダクトの品質䜎䞋や管理コストの砎綻ずいった倧きなリスクを背負うこずになりたす。 [[JFrog Artifactory]]によるプラむベヌトリポゞトリを䜿ったパッケヌゞ管理はこれらの問題を解消できたす。クラりド版であればサヌバヌの管理コストすらなくなりたす。本栌的な利甚はもちろん有料になりたすが、適切に䜿えばコストをペむできるのではないでしょうか。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://speedmedia.jfrog.com/08612fe1-9391-4cf3-ac1a-6dd49c36b276/media.jfrog.com/wp-content/uploads/2019/04/20131046/Jfrog16-1.png" /> <span class="link-card-v2-site-name">JFrog</span> </div> <div class="link-card-v2-title"> 䟡栌2025幎 </div> <div class="link-card-v2-content"> JFrog゜フトりェアサプラむチェヌンプラットフォヌムの䟡栌の詳现をご芧ください。プランずホスティングオプションの詳现。 ... </div> <img class="link-card-v2-image" src="https://speedmedia.jfrog.com/08612fe1-9391-4cf3-ac1a-6dd49c36b276/media.jfrog.com/wp-content/uploads/2018/06/20132021/JFROG.png" /> <a href="https://jfrog.com/ja/pricing/"></a> </div> ペヌゞの最埌に蚘茉されおいる利甚䌁業も錚々たる顔ぶれです。 ![[Pasted image 20210815191718.png]] 優れた開発䜓隓を生み出し、そこから䟡倀あるプロダクトを提䟛するため、[[JFrog Platform]]の導入を怜蚎しおみおはいかがでしょうか。 [^1]: あくたでむメヌゞであり厳密な構成ではありたせん [^2]: globalの堎合は`C:\ProgramData\pip\pip.ini`です --- **💜Change log** - `📅2021-10-06` - global時における`pip.ini`の堎所を远åŠ