<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yuki Nagae</title>
    <description>The latest articles on DEV Community by Yuki Nagae (@yukinagae).</description>
    <link>https://dev.to/yukinagae</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F56437%2F77a993b0-0435-4ae9-a69b-7016fb1c32a6.png</url>
      <title>DEV Community: Yuki Nagae</title>
      <link>https://dev.to/yukinagae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yukinagae"/>
    <language>en</language>
    <item>
      <title>Setup Fira Code font for Visual Studio Code</title>
      <dc:creator>Yuki Nagae</dc:creator>
      <pubDate>Sat, 07 Jan 2023 12:51:32 +0000</pubDate>
      <link>https://dev.to/yukinagae/setup-fira-code-font-for-visual-studio-code-4dhi</link>
      <guid>https://dev.to/yukinagae/setup-fira-code-font-for-visual-studio-code-4dhi</guid>
      <description>&lt;p&gt;Install &lt;a href="https://github.com/tonsky/FiraCode" rel="noopener noreferrer"&gt;Fira Code&lt;/a&gt; via brew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap homebrew/cask-fonts
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; font-fira-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can do the same thing with a .Brewfile.&lt;br&gt;
First edit &lt;code&gt;~/.Brewfile&lt;/code&gt; as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tap "homebrew/cask-fonts"
cask "font-fira-code"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And install with the .Brewfile by the below brew command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew bundle install --global
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, edit your Visual Studio Code &lt;code&gt;settings.json&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fira Code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontLigatures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>firacode</category>
      <category>font</category>
      <category>vscode</category>
    </item>
    <item>
      <title>"asdf" multiple runtime version manager to install node.js</title>
      <dc:creator>Yuki Nagae</dc:creator>
      <pubDate>Fri, 06 Jan 2023 12:58:40 +0000</pubDate>
      <link>https://dev.to/yukinagae/asdf-multiple-runtime-version-manager-to-install-nodejs-8ec</link>
      <guid>https://dev.to/yukinagae/asdf-multiple-runtime-version-manager-to-install-nodejs-8ec</guid>
      <description>&lt;p&gt;&lt;a href="https://asdf-vm.com/" rel="noopener noreferrer"&gt;asdf&lt;/a&gt; is a runtime version management tool. It is similar to other tools such as rbenv (for ruby), nvm (for node), goenv (for golang).&lt;/p&gt;

&lt;p&gt;Those tools focus on one language runtime, on the other hand asdf covers most of those language runtimes. Using asdf, you don't have to install each runtime version manager tool one by one, just asdf is enough.&lt;/p&gt;

&lt;p&gt;Install asdf via brew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add node.js plugin for asdf:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asdf plugin-add nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install node.js latest version and set it on a global context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;nodejs latest
asdf global nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can specify a version instead of "latest":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;nodejs 19.3.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check node.js and npm versions (versions depend on your environment):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
v19.3.0
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nt"&gt;-v&lt;/span&gt;
9.2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all!&lt;/p&gt;

</description>
      <category>asdf</category>
      <category>node</category>
      <category>npm</category>
    </item>
    <item>
      <title>Beginner Guide on “Poetry”, New Python dependency management tool</title>
      <dc:creator>Yuki Nagae</dc:creator>
      <pubDate>Sat, 20 Apr 2019 09:33:04 +0000</pubDate>
      <link>https://dev.to/yukinagae/beginner-guide-on-poetry-new-python-dependency-management-tool-4327</link>
      <guid>https://dev.to/yukinagae/beginner-guide-on-poetry-new-python-dependency-management-tool-4327</guid>
      <description>&lt;h1&gt;
  
  
  Why I write this post?
&lt;/h1&gt;

&lt;p&gt;Once I wrote a &lt;a href="https://dev.to/yukinagae/your-first-guide-to-getting-started-with-pipenv-50bn"&gt;blog post&lt;/a&gt; about “pipenv”, which is one of the Python package management tools,  &lt;a href="https://dev.to/dbanty"&gt;Dylan&lt;/a&gt; gave me a &lt;a href="https://dev.to/dbanty/comment/a6h9"&gt;comment&lt;/a&gt;  on the post.&lt;/p&gt;

&lt;p&gt;He pointed out some of the issues on pipenv, and his suggestion was to use &lt;a href="https://poetry.eustace.io" rel="noopener noreferrer"&gt;Poetry&lt;/a&gt; instead of pipenv.&lt;/p&gt;

&lt;p&gt;In this post, I’ll briefly cover what Poetry is and some usage of it. This is just a first try to use Poetry, and hopefully, I write more details in the future blog posts :)&lt;/p&gt;

&lt;h1&gt;
  
  
  What is “Poetry” and why?
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Poetry&lt;/em&gt; is a Python dependency management tool.&lt;/p&gt;

&lt;p&gt;The main reason why Poetry developed is mentioned &lt;a href="https://github.com/sdispater/poetry#why" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Packaging systems and dependency management in Python are rather convoluted and hard to understand for newcomers. Even for seasoned developers it might be cumbersome at times to create all files needed in a Python project:setup.py, requirements.txt, setup.cfg, MANIFEST.in and the newly added Pipfile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is really true that there are many files we should consider such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup.py&lt;/li&gt;
&lt;li&gt;requirements.txt&lt;/li&gt;
&lt;li&gt;setup.cfg&lt;/li&gt;
&lt;li&gt;MANIFEST.in&lt;/li&gt;
&lt;li&gt;Pipfile and Pipfile.lock (pipenv)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this messy situation, Poetry comes here for us with only one &lt;code&gt;pyproject.toml&lt;/code&gt; file to manage all the dependencies.&lt;/p&gt;

&lt;p&gt;Now, let’s setup Poetry!&lt;/p&gt;

&lt;h1&gt;
  
  
  Setup Poetry
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 2.7 or 3.4+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll use Python 3.6.0 in this post.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
Python 3.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Install Poetry via an installer provided.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
Retrieving Poetry metadata

&lt;span class="c"&gt;# Welcome to Poetry!&lt;/span&gt;

This will download and &lt;span class="nb"&gt;install &lt;/span&gt;the latest version of Poetry,
a dependency and package manager &lt;span class="k"&gt;for &lt;/span&gt;Python.

It will add the &lt;span class="sb"&gt;`&lt;/span&gt;poetry&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;command &lt;/span&gt;to Poetry&lt;span class="s1"&gt;'s bin directory, located at:

$HOME/.poetry/bin

This path will then be added to your `PATH` environment variable by
modifying the profile files located at:

$HOME/.profile
$HOME/.bash_profile

You can uninstall at any time with `poetry self:uninstall`,
or by executing this script with the --uninstall option,
and these changes will be reverted.

Installing version: 0.12.12
  - Downloading poetry-0.12.12-darwin.tar.gz (7.23MB)

Poetry (0.12.12) is installed now. Great!

To get started you need Poetry'&lt;/span&gt;s bin directory &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.poetry/bin&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;your &lt;span class="sb"&gt;`&lt;/span&gt;PATH&lt;span class="sb"&gt;`&lt;/span&gt;
environment variable. Next &lt;span class="nb"&gt;time &lt;/span&gt;you log &lt;span class="k"&gt;in &lt;/span&gt;this will be &lt;span class="k"&gt;done
&lt;/span&gt;automatically.

To configure your current shell run &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.poetry/env&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To activate &lt;code&gt;poetry&lt;/code&gt; command, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.poetry/env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;code&gt;poetry&lt;/code&gt; command should be available. Let’s check the Poetry version installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;poetry —version
Poetry 0.12.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works!&lt;/p&gt;

&lt;h1&gt;
  
  
  Poetry demo
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Create a template
&lt;/h2&gt;

&lt;p&gt;First, I’ll create a demo app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry new poetry-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project structure is like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;poetry-demo
&lt;span class="nv"&gt;$ &lt;/span&gt;tree
&lt;span class="nb"&gt;.&lt;/span&gt;
├── README.rst
├── poetry_demo
│   └── __init__.py
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_poetry_demo.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s see &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[tool.poetry]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"poetry-demo"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="py"&gt;authors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"[Your Name] &amp;lt;[Your Email]&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[tool.poetry.dependencies]&lt;/span&gt;
&lt;span class="py"&gt;python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^3.6"&lt;/span&gt;

&lt;span class="nn"&gt;[tool.poetry.dev-dependencies]&lt;/span&gt;
&lt;span class="py"&gt;pytest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^3.0"&lt;/span&gt;

&lt;span class="nn"&gt;[build-system]&lt;/span&gt;
&lt;span class="py"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;["poetry&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.12&lt;/span&gt;&lt;span class="s"&gt;"]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;build-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"poetry.masonry.api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add dependency
&lt;/h2&gt;

&lt;p&gt;I can specify a dependency in the &lt;code&gt;pyproject.toml&lt;/code&gt; file directly, but it looks easy for me to use &lt;code&gt;add&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poetry add pendulum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Automatically, &lt;code&gt;pendulum&lt;/code&gt; is added to the &lt;code&gt;pyproject.toml&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[tool.poetry.dependencies]&lt;/span&gt;
&lt;span class="py"&gt;python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^3.6"&lt;/span&gt;
&lt;span class="py"&gt;pendulum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^2.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, &lt;code&gt;poetry.lock&lt;/code&gt; is created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;tree
&lt;span class="nb"&gt;.&lt;/span&gt;
├── README.rst
├── poetry.lock
├── poetry_demo
│   └── __init__.py
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_poetry_demo.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since this is just a first try to use Poetry, I’ll continue using it and may write a blog post again if I find something useful :)&lt;/p&gt;

&lt;h1&gt;
  
  
  TODO
&lt;/h1&gt;

&lt;p&gt;There are several things I’d like to try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] How to integrate with existing requirements.txt?&lt;/li&gt;
&lt;li&gt;[ ] Try Poetry &lt;code&gt;publish&lt;/code&gt; command to publish my package to PyPI&lt;/li&gt;
&lt;li&gt;[ ] Compare Poetry with pipenv&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Poetry

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://poetry.eustace.io" rel="noopener noreferrer"&gt;Poetry - Python dependency management and packaging made easy.&lt;/a&gt;: Official documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sdispater/poetry" rel="noopener noreferrer"&gt;sdispater/poetry: Python dependency management and packaging made easy.&lt;/a&gt;: GitHub&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://hynek.me/articles/python-app-deps-2018/" rel="noopener noreferrer"&gt;Python Application Dependency Management in 2018 · Homepage of Hynek Schlawack&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>python</category>
      <category>poetry</category>
      <category>pipenv</category>
      <category>package</category>
    </item>
    <item>
      <title>Your First Guide to Getting Started with “pipenv”</title>
      <dc:creator>Yuki Nagae</dc:creator>
      <pubDate>Wed, 17 Apr 2019 06:29:55 +0000</pubDate>
      <link>https://dev.to/yukinagae/your-first-guide-to-getting-started-with-pipenv-50bn</link>
      <guid>https://dev.to/yukinagae/your-first-guide-to-getting-started-with-pipenv-50bn</guid>
      <description>&lt;h1&gt;
  
  
  What is “pipenv”?
&lt;/h1&gt;

&lt;p&gt;There are many package manager tools in other programming languages such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby

&lt;ul&gt;
&lt;li&gt;bundler&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;PHP

&lt;ul&gt;
&lt;li&gt;composer&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;NodeJS

&lt;ul&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;yarn&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Rust 

&lt;ul&gt;
&lt;li&gt;cargo&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If you know any of the above tools, it might be easy to understand what it is.&lt;br&gt;
&lt;code&gt;pipenv&lt;/code&gt; is just a package management tool for Python as same as those tools.&lt;/p&gt;
&lt;h1&gt;
  
  
  Why “pipenv”?
&lt;/h1&gt;

&lt;p&gt;The official documentation &lt;a href="https://pipenv.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;Pipenv: Python Dev Workflow for Humans&lt;/a&gt; and this blog post  &lt;a href="https://opensource.com/article/18/2/why-python-devs-should-use-pipenv" rel="noopener noreferrer"&gt;Why Python devs should use Pipenv&lt;/a&gt; would tell us why we should use pipenv.&lt;/p&gt;

&lt;p&gt;Two main problems of “before” pipenv workflow are following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;pip&lt;/code&gt; and &lt;code&gt;virtualenv&lt;/code&gt; separately is not necessary any more!&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requirements.txt&lt;/code&gt; is problematic: see &lt;a href="https://www.kennethreitz.org/essays/a-better-pip-workflow" rel="noopener noreferrer"&gt;A Better Pip Workflow™&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;without version specified -&amp;gt; different versions every time for dev/prod environments!&lt;/li&gt;
&lt;li&gt;with version specified -&amp;gt; &lt;code&gt;--upgrade&lt;/code&gt; is hard!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we look back on the history of Python package management tools, there are many tools before, and this is terrible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package manager

&lt;ul&gt;
&lt;li&gt;Easy Install&lt;/li&gt;
&lt;li&gt;pip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Many many virtual environment tools

&lt;ul&gt;
&lt;li&gt;virtualenv&lt;/li&gt;
&lt;li&gt;venv&lt;/li&gt;
&lt;li&gt;pyenv&lt;/li&gt;
&lt;li&gt;pyenv-virtualenv&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, &lt;code&gt;pipenv&lt;/code&gt; comes to our rescue!&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup pipenv
&lt;/h2&gt;

&lt;p&gt;Check Python version (should be 3.x)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
Python 3.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check pip version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nt"&gt;--version&lt;/span&gt;
pip 18.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install pipenv&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;pipenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check pipenv version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pipenv &lt;span class="nt"&gt;--version&lt;/span&gt;
pipenv, version 2018.11.26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Success: pipenv is installed!&lt;/p&gt;

&lt;h2&gt;
  
  
  pipenv workflow
&lt;/h2&gt;

&lt;p&gt;Install dependencies (pipenv automatically detect &lt;code&gt;requirements.txt&lt;/code&gt;and solve the dependencies)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;YOUR PROJECT]
&lt;span class="nv"&gt;$ &lt;/span&gt;pipenv &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Pipfile&lt;/code&gt; and &lt;code&gt;Pipfile.lock&lt;/code&gt; should be created&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pipfile: list of all installed packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Pipfile example)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[[source]]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"pypi"&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://pypi.org/simple"&lt;/span&gt;
&lt;span class="py"&gt;verify_ssl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[dev-packages]&lt;/span&gt;

&lt;span class="nn"&gt;[packages]&lt;/span&gt;
&lt;span class="py"&gt;jupyter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;seaborn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;numpy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;pandas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;plotly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;scipy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;six&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;sklearn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;pyspark&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;flake8&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;autopep8&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;span class="py"&gt;Flask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;

&lt;span class="nn"&gt;[requires]&lt;/span&gt;
&lt;span class="py"&gt;python_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"3.7"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pipfile.lock: maintain a proper dependencies and sub packages with version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Pipfile.lock  example)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"_meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sha256"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"pipfile-spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"requires"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"python_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.7"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pypi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://pypi.org/simple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"verify_ssl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"appnope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"hashes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"sha256: xxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"sha256: xxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"markers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sys_platform == 'darwin'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"==0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"attrs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"hashes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"sha256: xxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"sha256: xxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"==19.1.0"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"autopep8"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"hashes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"sha256: xxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pypi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"==1.4.4"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, run your python script (Installed packages are available when you use &lt;code&gt;pipenv run&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pipenv run python &lt;span class="o"&gt;[&lt;/span&gt;YOUR PYTHON MAIN SCRIPT]
Pipfile.lock not found, creating…
Locking &lt;span class="o"&gt;[&lt;/span&gt;dev-packages] dependencies…
Locking &lt;span class="o"&gt;[&lt;/span&gt;packages] dependencies…
✔ Success! 
Updated Pipfile.lock &lt;span class="o"&gt;(&lt;/span&gt;980232&lt;span class="o"&gt;)!&lt;/span&gt;
Installing dependencies from Pipfile.lock &lt;span class="o"&gt;(&lt;/span&gt;980232&lt;span class="o"&gt;)&lt;/span&gt;…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 73/73 — 00:01:22
To activate this project&lt;span class="s1"&gt;'s virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading!&lt;br&gt;
 If you enjoyed this article, feel free to hit that clap button 👏.&lt;/p&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pipenv.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;Pipenv: Python Dev Workflow for Humans&lt;/a&gt;: Official documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://opensource.com/article/18/2/why-python-devs-should-use-pipenv" rel="noopener noreferrer"&gt;Why Python devs should use Pipenv&lt;/a&gt;: Why pipenv?&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@kurianbenoy1998/the-hitchhikers-guide-to-pipenv-bb0e42673bf5" rel="noopener noreferrer"&gt;The Hitchhikers guide to pipenv&lt;/a&gt;: pipenv guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@ryanbrookepayne/python-dependency-management-with-pipenv-e9f11e8f5386" rel="noopener noreferrer"&gt;Python Dependency Management with pipenv&lt;/a&gt;: pipenv guide&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@grassfedcode/five-myths-about-pipenv-698c5f198e4b" rel="noopener noreferrer"&gt;Five Myths About Pipenv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>pipenv</category>
      <category>package</category>
    </item>
  </channel>
</rss>
