[PYTHON] Comparison of gem, bundler and pip, venv

The README, a tool made in Ruby or Python, often contains simple commands such as gem install redcarpet or pip install pygments as an installation method.

However, when looking at this installation method, people who are not familiar with Ruby say, "I get an error that I do not understand even if I gem install anyway, and if I complain, it seems that it is better not to use bundler", Python If you're new to Ruby, you might wonder, "Where do you install this? Isn't it like bundler?"

At least I didn't like the tools that gem install installs. But it would be different to complain, "That's why gem is ...", I thought Rubyist would have the same feelings for pip install, so I decided to write this article for someone like me. You may have a wrong understanding of the tools on the Ruby side, so if you make a mistake, please make an edit request.

gem install and pip install

Both are used to install third-party packages.

User-independent, usually /usr/local/lib/ruby/gems/2.3.0 for Ruby and /usr/local/lib/python3.5/site-packages/ for Python Attempts to install in location.

gem install --user-install <package name> or pip install --user <package name>, then ~ / .gem / ruby / 2.3.0 or ~ / .local / lib / python3. Install it in a location like 5 ( ~ / Library / Python / 3.5 / lib / python / site-packages if maxOS is Framework".

Note: Pip, which can be installed on Ubuntu with ʻapt install python3-pip`, is customized to automatically install with --user if you don't have sudo.

bundle install and pip install -r

Both are used to install the list of defined packages.

For bundler, bundle install will install the package based on Gemfile (if Gemfile.lock is missing or Gemfile has been updated), and the actual installed package (Gemfile) Generates a Gemfile.lock that describes the version (including dependent packages not included in). If you already have Gemfile.lock, you can install it based on it so that you can install the exact same version of the library in different environments.

For pip, pip install -r requirements.txt will also install the package according to the rules in requirements.txt. If you want to lock a version, you can do pip freeze> requirements.lock to export all currently installed libraries and versions, and then pip install -r requirements.lock.

While bundler recommends that Gemfile.lock be automatically generated and included in version control, pip does not automatically create a lock file and does not recommend a specific approach. If you want to deploy the web application in the same way in CI and production environment, follow the same policy as bundler, and if you are a project to develop a library and just install the tools used for development, you only need requirements.txt is enough. That's why there is no equivalent to Gemfile.lock in OSS framework and library repositories.

bundler --path and venv

Use bundle install --path = vendor / bundle or python3 -m venv / path / to / python if you want to manage the libraries you want to install application-specifically rather than sharing them across Ruby or Python. .. They have the same purpose, but they have different implementation methods, so be careful.

bundle install --path just installs the package under the specified directory. You cannot use the packages under that directory as they are, but you can use them with the bundle exec command.

On the other hand, python3 -m venv / path / to / python creates a" virtual environment "that behaves as if you had a new Python installed in / path / to / python. Although this virtual environment has separate third-party packages, the standard library uses the original Python stuff, so it's as light as the bundler path.

Since venv only creates a virtual environment, you need to use pip in that environment to do pip install -r requirements.txt to even install it for bundle install --path. When you execute commands in a virtual environment like this, you are executing commands in / path / to / python / bin instead of using commands like bundle exec. There are several ways to do this.

The ʻactivate` script does three main things.

at the end

This article does not discuss which is better.

If you're used to one, you can't do the same thing with the other, which can be a hassle, so be patient if you want to dissipate the unfamiliar.

Recommended Posts

Comparison of gem, bundler and pip, venv
Comparison of Apex and Lamvery
Comparison of class inheritance and constructor description
Comparison of L1 regularization and Leaky Relu
Speed comparison of murmurhash3, md5 and sha1
Comparison of k-means implementation examples of scikit-learn and pyclustering
Comparison of R and Python writing (Euclidean algorithm)
Comparison of Python and Ruby (Environment / Grammar / Literal)
A quick comparison of Python and node.js test libraries
DNN (Deep Learning) Library: Comparison of chainer and TensorFlow (1)
Comparison of Windows Server and Free Linux to Commercial Linux
Comparison table of frequently used processes of Python and Clojure
Comparison of CoffeeScript with JavaScript, Python and Ruby grammar
[Python] pip and wheel
Comparison of LDA implementations
Comparison of online classifiers
Comparison of fitting programs
Python3, venv and Ansible
Comparison of how to use higher-order functions in Python 2 and 3
Comparison of Hungarian law and general-purpose solver for allocation problems
I want to know the features of Python and pip
[Package management] Installation destination and internal processing of apt and pip