長すぎて申し訳ありませんが、これはかなり複雑なpipenvの状況です。
私の会社では、pipenv(Pipfile
とPipfile.lock
の両方)を使用して、さまざまなエンジニアのラップトップで使用されるパッケージを制御しています。 AWS LambdaコードのデプロイにもZappaを使用しており、デプロイヤーのラップトップから依存関係を直接パッケージ化してデプロイするため、これはほとんどのチームよりもさらに重要です。したがって、人々のラップトップが依存関係に関して完全に揃っていない場合、誰がそれを展開したかに応じて、クラウドで異なる動作を得ることができます。
Pipfile
とPipfile.lock
で依存関係を完全に制御しようとした後でも、pip freeze
とデプロイされたコードのエラーが示すように、異なるラップトップで異なるPythonパッケージを取得することになります。
これが私のラップトップと上司の違いを示している正確なプロセスです(引用したPipfileコードは複数行にありますが、SOのフォーマットに問題があるため、1行に圧縮しています)。
[requires] python_version = "3.6" [packages] flask = "*"
のようなワイルドカードでパッケージが指定されたPipfile
しかありませんでした。また、Pipfile.lock
がありませんでした。上司(このプロジェクトの最初のコーダー)は常に--skip-lock
を実行していましたPipfile
をアップグレードしてワイルドカードを明示的なバージョンに置き換え、[requires] python_version = "3.6.4" [packages] Flask = "==1.0.2"
のようにPythonバージョンをより具体的にすることから始めました。これを行うために、上司のpip freeze
出力のコピーを取得し、バージョンをPipfile
にコピーしました。ここにリストされているものと名前が一致していました(上流の依存関係であると想定して一致しなかったものはスキップしました。まだそれに触れていませんでした)。私はこれをコミットしました。Pipfile.lock
を使用して上流の依存関係を制御することにしました。ですから、上司はpip install
なしで--skip-lock
を初めて実行して作成し、それをコミットしました。Pipfile.lock
をプルし、pipenv --rm
で環境を削除し、pipenv install
で環境を再作成しましたpip freeze
を実行し、出力を比較しましたが、まだいくつかの違いがあります。上司にpipenv
環境を削除して、コミットされたPipfile
とPipfile.lock
に基づいて再インストールしてもらえると思いますが、それらは彼のpip freeze
に基づいているため、何かが変わったとしたら少し驚きます。
だから私はただ疑問に思っています:この動作は本当に予想外ですか?すべてのバージョンがPipfile.lock
でロックされている限り、pipenv
、Pipfile
、および==[version]
の組み合わせにより、2人のユーザーが同じパッケージを確実に使用できると常に思っていました。完全に一致させるために他に必要なことはありますか?
それが本当に予期しないものである場合、他に考えられる唯一のことは、彼がpipenv Shell
の前にpip freeze
を実行しなかった可能性があることですが、Pipfiles
に対してうまく並んでいたため、彼はそうしたと思います。
補足:Pipfile
の[dev-packages]
をバージョンに変換していません。何をするのかわからないので、無関係であると想定しているからです。したがって、それらはまだpylint = "*"
のようなものです
追加情報
以下はコメントに応答するための追加情報です...しかし、最初に私が気づいたいくつかの興味深い事柄:
pip freeze
の差分)の違いは、Pipfile
にはありません。pip freeze
の出力はPipfile.lock
の内容と一致しているようですが、上司の出力は一致していません。これは違いを説明していると思いますが、彼のpip freeze
出力が、Pipfile.lock
の外部からpipenv lock
を実行したことが問題でない限り、彼のpipenv lock
によって作成されたpipenv Shell
と一致しないことは少し意外です。コメントに応答するには...これは、私と上司のラップトップの(両方のpipenvシェルからの)pipフリーズ出力間の差分の最初の部分です。
上司のラップトップとPipfile.lock
の違いは次のとおりです。 Pipfile.lock
は、彼にpipenv lock
(pipenv Shell
の外ではそれは重要ではないと思います)を実行させ、それを今すぐコミットすることで得られました。次に、それをプルし、pipenv --rm
を使用して環境を削除し、pipenv install
を実行して、コミットしたばかりのPipfile.lock
と次のような違いを得ました。彼のバージョンは再び左側にあります。
これらはすべての違いです。私が得られないことの1つは、pip freeze
を使用する場合よりもここで違いが少ない理由です。私たちのPipfile
は、まだ2人で同じです。
まったく同じ環境を確実に共有する唯一の方法は、Pipfile.lock
(オプションでpipenv sync
)を使用して、同じpipenv sync --dev
と同期することです。
Pipfile
は人間のヘルパーであり、Pipfile.lock
作成の中間体であり、依存関係が完全に同じであるとは限りません。
内部でのpipenv install
呼び出し2 pipenv
関数:lock
およびsync
。 pipenv lock
は、Pipfile
からPipfile.lock
を生成します。 Pipfile
の固定されたバージョンでも、固定されたパッケージの依存関係が固定されない可能性があるため(パブリッシャーによって)、異なるタイミングで生成された場合、異なるPipfile.lock
が存在する可能性があります。 pipenv sync
次に、Pipfile.lock
にある正確なパッケージをインストールします。
Pipfile.lock
の依存関係から環境を直接インストールするには、pipenv --python 3.6 install --ignore-pipfile
を使用する必要があります。そうしないと、Pipfile.lock
がPipfile
から再生成されます。
問題を簡単に解決するには、Pipfile.lock
のバージョンを修正します(バージョン管理を使用すればコミットできますが、もちろんそうします)。次に、どちらもpipenv sync
を使用します。
次に、マイナーバージョン、バグ修正を行う限り、Pipfile.lock
をまったく同じに保ち、メジャーバージョンの最新の依存関係を取得するために自由に再生成してください。私のプロジェクトでは、Pipfile
のほとんどすべての依存関係が固定されていません。新しいメジャーバージョンを開始するときに、Pipfile.lock
を更新して新しい依存関係バージョンを試し、すべてをテストし、依存関係を最新のバージョンで下位互換性のない変更が導入された場合は以前のバージョン。次のメジャーバージョンまでPipfile.lock
を修正します。
pipenv install
Pipfileからインストールします。上流の依存関係は異なる場合があります。
pipenv sync
Pipfile.lockからインストールします。何も変わりません。
それがコマンドのヘルプを読んだときの私の理解です。
$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...
Commands:
# ...
install Installs provided packages and adds them to Pipfile, or (if no
# ...
sync Installs all packages specified in Pipfile.lock.