<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Pip on Coding and Life</title>
    <link>https://zihuanling.github.io/tags/pip/</link>
    <description>Recent content in Pip on Coding and Life</description>
    <image>
      <url>https://zihuanling.github.io/avatar.jpeg</url>
      <link>https://zihuanling.github.io/avatar.jpeg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 24 May 2022 14:16:18 +0800</lastBuildDate><atom:link href="https://zihuanling.github.io/tags/pip/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用Pip Tools生成好看的依赖文件</title>
      <link>https://zihuanling.github.io/posts/pip-tools-generate-dependencies/</link>
      <pubDate>Tue, 24 May 2022 14:16:18 +0800</pubDate>
      
      <guid>https://zihuanling.github.io/posts/pip-tools-generate-dependencies/</guid>
      <description>&lt;p&gt;项目地址： &lt;a href=&#34;https://pypi.org/project/pip-tools/&#34;&gt;https://pypi.org/project/pip-tools/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pip-tools 是一个命令行工具集合，主要有两个命令： &lt;code&gt;pip-compile&lt;/code&gt;，&lt;code&gt;pip-sync&lt;/code&gt;，现在主要用的是 &lt;code&gt;pip-compile&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在写python项目的时候，我们通常会依赖到其他的包，比如写一个后端的服务，我们可能会依赖到&lt;code&gt;flask/pymysql&lt;/code&gt;这些基础的包，随着开发的进行，我们还可能会引入更多的依赖。&lt;/p&gt;
&lt;p&gt;这些python依赖包构成了一个完整的服务，开发完成后，我们将这些服务部署到服务器上时，只需要安装好对应的依赖，便可以直接运行服务。&lt;/p&gt;
&lt;p&gt;但是，如果我们不将生产环境的依赖固定下来的话，整个服务可能会因为某一次服务更新，其中某个的更新带来的不兼容导致整个服务崩溃。比如pyjwt，在1.7.1版本之前生成的jwt-token是一个bytes类型，我们将其转换成为字符串需要使用到&lt;code&gt;decode()&lt;/code&gt;方法。但是在更新到2.0之后，生成的jwt-token是一个字符串类型，如果我们对其再调用&lt;code&gt;decode&lt;/code&gt;方法的话，就会发生错误。&lt;/p&gt;
&lt;p&gt;这就显现出了&lt;strong&gt;固定依赖&lt;/strong&gt;的重要性了。&lt;/p&gt;
&lt;p&gt;通常，固定依赖，我们可以在开发环境使用 &lt;code&gt;pip freeze&lt;/code&gt;命令，直接将开发环境的所有版本固定下来到一个 requirements.txt 文件里面，这是懒人做法，当然也很有效。但是文件里面会带有一些系统的依赖版本，比如urllib 之类的，这些我们是不需要再次安装的，所以，如果这些依赖出现在 requirements.txt 文件里面，就会显得&lt;strong&gt;不那么干净&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这时，我们可以使用 pip-tools里面的 &lt;code&gt;pip-compile&lt;/code&gt; 工具，对依赖进行编译，生成一份漂亮的依赖文件。&lt;/p&gt;
&lt;h2 id=&#34;直接生成最新依赖&#34;&gt;直接生成最新依赖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;首先，我们将项目中直接依赖的包写到&lt;code&gt;requirements.in&lt;/code&gt;文件里面&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;requirements.in&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-in&#34; data-lang=&#34;in&#34;&gt;pymysql
flask
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;使用 &lt;code&gt;pip-compile&lt;/code&gt; 自动使用最新依赖版本生成依赖文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;命令： &lt;code&gt;pip-compile&lt;/code&gt;, 输出requirements.txt文件：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;requirements.txt&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# This file is autogenerated by pip-compile with python 3.8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# To update, run:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#    pip-compile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--index-url https://pypi.doubanio.com/simple
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--trusted-host pypi.doubanio.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;click==8.1.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via flask
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flask==2.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via -r requirements.in
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;importlib-metadata==4.11.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via flask
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;itsdangerous==2.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via flask
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jinja2==3.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via flask
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;markupsafe==2.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via jinja2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pymysql==1.0.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via -r requirements.in
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;werkzeug==2.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via flask
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zipp==3.8.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # via importlib-metadata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，我们就得到了一份漂亮的依赖文件，我们还可以清晰的看到某一个依赖包是哪个包的依赖。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
