pipでインストールできるPythonパッケージの名前を考えると、pipがインストールできるすべての可能なバージョンのリストを見つける方法はありますか?現在、それは試行錯誤です。
サードパーティライブラリのバージョンをインストールしようとしていますが、最新バージョンが新しすぎるため、下位互換性のない変更が行われました。それで、pipが知っているすべてのバージョンのリストをどうにかして、テストできるようにしたいと思います。
pip install pylibmc==
は完璧です。
pipでインストールできるPythonパッケージの名前を考えると、pipがインストールできるすべての可能なバージョンのリストを見つける方法はありますか?現在、それは試行錯誤です。
サードパーティライブラリのバージョンをインストールしようとしていますが、最新バージョンが新しすぎるため、下位互換性のない変更が行われました。それで、pipが知っているすべてのバージョンのリストをどうにかして、テストできるようにしたいと思います。
pip install pylibmc==
は完璧です。
回答:
(更新:2020年3月の時点で、を介してインストールされた卵黄pip install yolk3k
は最新バージョンのみを返すと多くの人が報告しています。 クリスの回答が最も賛成票を持ち、私のために働いたようです)
pastebinのスクリプトは機能します。ただし、複数の環境/ホストで作業している場合は、毎回コピー/作成する必要があるため、あまり便利ではありません。
より優れた総合的なソリューションは、pipでインストールできるyolk3kを使用することです。たとえば、利用可能なDjangoのバージョンを確認するには:
$ pip install yolk3k
$ yolk -V django
Django 1.3
Django 1.2.5
Django 1.2.4
Django 1.2.3
Django 1.2.2
Django 1.2.1
Django 1.2
Django 1.1.4
Django 1.1.3
Django 1.1.2
Django 1.0.4
yolk3k
2012年にyolk
開発を中止したオリジナルのフォークです。(以下のコメントで示されているように)もはや保守されていませんが、Python 3のようであり、Python 3をサポートしています。yolk
yolk3k
注:私はyolk3kの開発には関与していません。何かが正常に機能していないように見える場合、ここにコメントを残しても大きな違いはないはずです。代わりにyolk3kの課題追跡を使用し、可能であれば修正の提出を検討してください。
以下のためのピップ> = 9.0の使用
$ pip install pylibmc==
Collecting pylibmc==
Could not find a version that satisfies the requirement pylibmc== (from
versions: 0.2, 0.3, 0.4, 0.5.1, 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5, 0.6.1, 0.6,
0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.7, 0.8.1, 0.8.2, 0.8, 0.9.1, 0.9.2, 0.9,
1.0-alpha, 1.0-beta, 1.0, 1.1.1, 1.1, 1.2.0, 1.2.1, 1.2.2, 1.2.3, 1.3.0)
No matching distribution found for pylibmc==
–使用可能なすべてのバージョンが印刷され、追加のパッケージを実際にダウンロードまたはインストールする必要はありません。
以下のためのピップ<9.0の使用
pip install pylibmc==blork
ここで、有効なバージョン番号blork
ではない任意の文字列を指定できます。
pip install --only-binary :all: pylibmc
、バイナリパッケージとして利用可能なpylibmcのすべてのバージョンを一覧表示します。
pip install pylibmc==9999999 | tr ', ' "\n" | sort -n
更新:
2017年9月以降、この方法は機能しなくなり--no-install
ました。pip7で削除されました
を使用するとpip install -v
、利用可能なすべてのバージョンを確認できます
root@node7:~# pip install web.py -v
Downloading/unpacking web.py
Using version 0.37 (newest of versions: 0.37, 0.36, 0.35, 0.34, 0.33, 0.33, 0.32, 0.31, 0.22, 0.2)
Downloading web.py-0.37.tar.gz (90Kb): 90Kb downloaded
Running setup.py egg_info for package web.py
running egg_info
creating pip-egg-info/web.py.egg-info
パッケージをインストールしない場合は、次のいずれかの解決策を使用してください。
root@node7:~# pip install --no-deps --no-install flask -v
Downloading/unpacking flask
Using version 0.10.1 (newest of versions: 0.10.1, 0.10, 0.9, 0.8.1, 0.8, 0.7.2, 0.7.1, 0.7, 0.6.1, 0.6, 0.5.2, 0.5.1, 0.5, 0.4, 0.3.1, 0.3, 0.2, 0.1)
Downloading Flask-0.10.1.tar.gz (544Kb): 544Kb downloaded
または
root@node7:~# cd $(mktemp -d)
root@node7:/tmp/tmp.c6H99cWD0g# pip install flask -d . -v
Downloading/unpacking flask
Using version 0.10.1 (newest of versions: 0.10.1, 0.10, 0.9, 0.8.1, 0.8, 0.7.2, 0.7.1, 0.7, 0.6.1, 0.6, 0.5.2, 0.5.1, 0.5, 0.4, 0.3.1, 0.3, 0.2, 0.1)
Downloading Flask-0.10.1.tar.gz (544Kb): 4.1Kb downloaded
pip 1.0でテスト済み
root@node7:~# pip --version
pip 1.0 from /usr/lib/python2.7/dist-packages (python 2.7)
pip 1.5.4
与えDEPRECATION: --no-install, --no-download, --build, and --no-clean are deprecated. See https://github.com/pypa/pip/issues/906.
、すでにインストールされているパッケージのために利用可能なバージョンが表示されません。
-v
です。私の残りの答えは、追加効果(インストール/ダウンロード)を回避するためです。インストールされたpkgの場合、-upgradeを追加するだけです。Anw、すべてをより簡単にするために個別のvirtualenvを作成できます。
no such option: --no-install
この情報を取得するためにサードパーティのパッケージは必要ありません。pypiは、以下のすべてのパッケージにシンプルなJSONフィードを提供します
https://pypi.python.org/pypi/{PKG_NAME}/json
すべてのバージョンを取得する標準ライブラリのみを使用するPythonコードを次に示します。
import json
import urllib2
from distutils.version import StrictVersion
def versions(package_name):
url = "https://pypi.python.org/pypi/%s/json" % (package_name,)
data = json.load(urllib2.urlopen(urllib2.Request(url)))
versions = data["releases"].keys()
versions.sort(key=StrictVersion)
return versions
print "\n".join(versions("scikit-image"))
そのコードが出力されます(2015年2月23日現在):
0.7.2
0.8.0
0.8.1
0.8.2
0.9.0
0.9.1
0.9.2
0.9.3
0.10.0
0.10.1
versions = [x for x in data["releases"] if any([y["python_version"] in ['cp26', '2.6'] for y in data["releases"][x]])]
のPython 2.6との互換性のあるバージョンを見つけること。(cp26
どこにも表示されませんでしたが、パッケージによってはcp27
、他のパッケージに存在する可能性があると推測しました。)
curl -s https://pypi.python.org/pypi/{PKG_NAME}/json | jq -r '.releases | keys[]' | sort -t. -k 1,1n -k 2,2n -k 3,3n
ValueError
それほど厳密ではないバージョン管理スキームに従う一部のパッケージに対して例外をスローします。これらのパッケージで修正するには、この要点を参照してください。
私は完全にシンプルなbashスクリプトを思いつきました。jqの作者に感謝します。
#!/bin/bash
set -e
PACKAGE_JSON_URL="https://pypi.org/pypi/${1}/json"
curl -s "$PACKAGE_JSON_URL" | jq -r '.releases | keys | .[]' | sort -V
更新:バージョン番号によるソートを追加。
curl
おそらく証明書のエラーが原因で、仕事に行くことができませんでした。 wget --no-check-certificate
動作しますが、curl -k --insecure
何も生成されません。私が得る警告wget
は言うERROR: certificate common name `www.python.org´ doesn´t match requested host name `pypi.python.org´.
sort -V
自作のバージョンでOSX上では動作しませんjq
yolkの代わりにyolk3kパッケージを使用できます。yolk3kはオリジナルのyolkのフォークで、python2と3の両方をサポートしています。
pip install yolk3k
yolk -V attest
Attest 0.5.3
しばらくpipのコードを見ると、パッケージの場所を特定するコードがのPackageFinder
クラスにあるようpip.index
です。そのメソッドfind_requirement
は、InstallRequirement
残念ながら最新バージョンのみを返します。
以下のコードは、元の関数のほぼ1:1のコピーであり、114行目のリターンがすべてのバージョンを返すように変更されています。
スクリプトは、最初の唯一の引数として1つのパッケージ名を想定し、すべてのバージョンを返します。
私はpipのコードに精通していないので、正確さを保証することはできません。しかし、うまくいけば、これが役立ちます。
出力例
python test.py pip
Versions of pip
0.8.2
0.8.1
0.8
0.7.2
0.7.1
0.7
0.6.3
0.6.2
0.6.1
0.6
0.5.1
0.5
0.4
0.3.1
0.3
0.2.1
0.2 dev
コード:
import posixpath
import pkg_resources
import sys
from pip.download import url_to_path
from pip.exceptions import DistributionNotFound
from pip.index import PackageFinder, Link
from pip.log import logger
from pip.req import InstallRequirement
from pip.util import Inf
class MyPackageFinder(PackageFinder):
def find_requirement(self, req, upgrade):
url_name = req.url_name
# Only check main index if index URL is given:
main_index_url = None
if self.index_urls:
# Check that we have the url_name correctly spelled:
main_index_url = Link(posixpath.join(self.index_urls[0], url_name))
# This will also cache the page, so it's okay that we get it again later:
page = self._get_page(main_index_url, req)
if page is None:
url_name = self._find_url_name(Link(self.index_urls[0]), url_name, req) or req.url_name
# Combine index URLs with mirror URLs here to allow
# adding more index URLs from requirements files
all_index_urls = self.index_urls + self.mirror_urls
def mkurl_pypi_url(url):
loc = posixpath.join(url, url_name)
# For maximum compatibility with easy_install, ensure the path
# ends in a trailing slash. Although this isn't in the spec
# (and PyPI can handle it without the slash) some other index
# implementations might break if they relied on easy_install's behavior.
if not loc.endswith('/'):
loc = loc + '/'
return loc
if url_name is not None:
locations = [
mkurl_pypi_url(url)
for url in all_index_urls] + self.find_links
else:
locations = list(self.find_links)
locations.extend(self.dependency_links)
for version in req.absolute_versions:
if url_name is not None and main_index_url is not None:
locations = [
posixpath.join(main_index_url.url, version)] + locations
file_locations, url_locations = self._sort_locations(locations)
locations = [Link(url) for url in url_locations]
logger.debug('URLs to search for versions for %s:' % req)
for location in locations:
logger.debug('* %s' % location)
found_versions = []
found_versions.extend(
self._package_versions(
[Link(url, '-f') for url in self.find_links], req.name.lower()))
page_versions = []
for page in self._get_pages(locations, req):
logger.debug('Analyzing links from page %s' % page.url)
logger.indent += 2
try:
page_versions.extend(self._package_versions(page.links, req.name.lower()))
finally:
logger.indent -= 2
dependency_versions = list(self._package_versions(
[Link(url) for url in self.dependency_links], req.name.lower()))
if dependency_versions:
logger.info('dependency_links found: %s' % ', '.join([link.url for parsed, link, version in dependency_versions]))
file_versions = list(self._package_versions(
[Link(url) for url in file_locations], req.name.lower()))
if not found_versions and not page_versions and not dependency_versions and not file_versions:
logger.fatal('Could not find any downloads that satisfy the requirement %s' % req)
raise DistributionNotFound('No distributions at all found for %s' % req)
if req.satisfied_by is not None:
found_versions.append((req.satisfied_by.parsed_version, Inf, req.satisfied_by.version))
if file_versions:
file_versions.sort(reverse=True)
logger.info('Local files found: %s' % ', '.join([url_to_path(link.url) for parsed, link, version in file_versions]))
found_versions = file_versions + found_versions
all_versions = found_versions + page_versions + dependency_versions
applicable_versions = []
for (parsed_version, link, version) in all_versions:
if version not in req.req:
logger.info("Ignoring link %s, version %s doesn't match %s"
% (link, version, ','.join([''.join(s) for s in req.req.specs])))
continue
applicable_versions.append((link, version))
applicable_versions = sorted(applicable_versions, key=lambda v: pkg_resources.parse_version(v[1]), reverse=True)
existing_applicable = bool([link for link, version in applicable_versions if link is Inf])
if not upgrade and existing_applicable:
if applicable_versions[0][1] is Inf:
logger.info('Existing installed version (%s) is most up-to-date and satisfies requirement'
% req.satisfied_by.version)
else:
logger.info('Existing installed version (%s) satisfies requirement (most up-to-date version is %s)'
% (req.satisfied_by.version, applicable_versions[0][1]))
return None
if not applicable_versions:
logger.fatal('Could not find a version that satisfies the requirement %s (from versions: %s)'
% (req, ', '.join([version for parsed_version, link, version in found_versions])))
raise DistributionNotFound('No distributions matching the version for %s' % req)
if applicable_versions[0][0] is Inf:
# We have an existing version, and its the best version
logger.info('Installed version (%s) is most up-to-date (past versions: %s)'
% (req.satisfied_by.version, ', '.join([version for link, version in applicable_versions[1:]]) or 'none'))
return None
if len(applicable_versions) > 1:
logger.info('Using version %s (newest of versions: %s)' %
(applicable_versions[0][1], ', '.join([version for link, version in applicable_versions])))
return applicable_versions
if __name__ == '__main__':
req = InstallRequirement.from_line(sys.argv[1], None)
finder = MyPackageFinder([], ['http://pypi.python.org/simple/'])
versions = finder.find_requirement(req, False)
print 'Versions of %s' % sys.argv[1]
for v in versions:
print v[1]
この小さなPython 3スクリプト(標準ライブラリモジュールのみを使用)を使用すると、JSON APIを使用してPyPIからパッケージの利用可能なバージョンのリストを取得し、新しい順に出力できます。いくつかの他のPythonのソリューションはここに掲載とは異なり、これはのような緩いバージョンでは壊れないdjango
の2.2rc1
かuwsgi
さん2.0.17.1
:
#!/usr/bin/env python3
import json
import sys
from urllib import request
from pkg_resources import parse_version
def versions(pkg_name):
url = f'https://pypi.python.org/pypi/{pkg_name}/json'
releases = json.loads(request.urlopen(url).read())['releases']
return sorted(releases, key=parse_version, reverse=True)
if __name__ == '__main__':
print(*versions(sys.argv[1]), sep='\n')
スクリプトを保存して、パッケージ名を引数として実行します。例:
python versions.py django
3.0a1
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2
2.2rc1
...
https://pypi.python.org/pypi/Django/-メンテナーがすべてのパッケージを表示することを選択したパッケージに対して機能します https://pypi.python.org/simple/pip/-とにかくトリックを実行する必要があります(すべてのリンクをリストします)
これは私にとってOSXで動作します:
pip install docker-compose== 2>&1 \
| grep -oE '(\(.*\))' \
| awk -F:\ '{print$NF}' \
| sed -E 's/( |\))//g' \
| tr ',' '\n'
1行に1つずつリストを返します。
1.1.0rc1
1.1.0rc2
1.1.0
1.2.0rc1
1.2.0rc2
1.2.0rc3
1.2.0rc4
1.2.0
1.3.0rc1
1.3.0rc2
1.3.0rc3
1.3.0
1.3.1
1.3.2
1.3.3
1.4.0rc1
1.4.0rc2
1.4.0rc3
1.4.0
1.4.1
1.4.2
1.5.0rc1
1.5.0rc2
1.5.0rc3
1.5.0
1.5.1
1.5.2
1.6.0rc1
1.6.0
1.6.1
1.6.2
1.7.0rc1
1.7.0rc2
1.7.0
1.7.1
1.8.0rc1
1.8.0rc2
1.8.0
1.8.1
1.9.0rc1
1.9.0rc2
1.9.0rc3
1.9.0rc4
1.9.0
1.10.0rc1
1.10.0rc2
1.10.0
または、利用可能な最新バージョンを取得するには:
pip install docker-compose== 2>&1 \
| grep -oE '(\(.*\))' \
| awk -F:\ '{print$NF}' \
| sed -E 's/( |\))//g' \
| tr ',' '\n' \
| gsort -r -V \
| head -1
1.10.0rc2
gsort
バージョンを解析するには、OSXにインストールする必要があることに注意してください。あなたはそれをインストールすることができますbrew install coreutils
私のプロジェクトにluddite
はこの機能があります。
使用例:
>>> import luddite
>>> luddite.get_versions_pypi("python-dateutil")
('0.1', '0.3', '0.4', '0.5', '1.0', '1.1', '1.2', '1.4', '1.4.1', '1.5', '2.0', '2.1', '2.2', '2.3', '2.4.0', '2.4.1', '2.4.2', '2.5.0', '2.5.1', '2.5.2', '2.5.3', '2.6.0', '2.6.1', '2.7.0', '2.7.1', '2.7.2', '2.7.3', '2.7.4', '2.7.5', '2.8.0')
のjson APIを照会することにより、利用可能なパッケージのすべてのバージョンをリストします。 https://pypi.org/のます
requirements.txt
古いパッケージのファイルをチェックすることであることがわかります。数行のコード以上です。requirements.txt
ファイルをチェックするには、すべてのパッケージバージョンを一覧表示する機能が必要です。この部分は意図的に分離されており、ludditeのパブリックAPIの一部です。そして、それはApache License 2.0のソースです。私はそれを「ブラックボックス」ソフトウェアパッケージと呼ぶのは本当に公平ではないと思います。
私はすべての運を持っていなかったyolk
、yolk3k
またはpip install -v
私はこれを使用して終了して(エリック・チェンマイの答えからのPython 3に適応します):
import json
import requests
from distutils.version import StrictVersion
def versions(package_name):
url = "https://pypi.python.org/pypi/{}/json".format(package_name)
data = requests.get(url).json()
return sorted(list(data["releases"].keys()), key=StrictVersion, reverse=True)
>>> print("\n".join(versions("gunicorn")))
19.1.1
19.1.0
19.0.0
18.0
17.5
0.17.4
0.17.3
...
StrictVersion
多くのパッケージのために動作しません(django
、uwsgi
、psycopg2
数名に)。parse_version()
from を使用できますsetuptools
(例については私の回答を参照してください)。
代替ソリューションは、ウェアハウスAPIを使用することです。
https://warehouse.readthedocs.io/api-reference/json/#release
たとえば、Flaskの場合:
import requests
r = requests.get("https://pypi.org/pypi/Flask/json")
print(r.json()['releases'].keys())
印刷されます:
dict_keys(['0.1', '0.10', '0.10.1', '0.11', '0.11.1', '0.12', '0.12.1', '0.12.2', '0.12.3', '0.12.4', '0.2', '0.3', '0.3.1', '0.4', '0.5', '0.5.1', '0.5.2', '0.6', '0.6.1', '0.7', '0.7.1', '0.7.2', '0.8', '0.8.1', '0.9', '1.0', '1.0.1', '1.0.2'])
自分bash
だけに依存する単純なスクリプトpython
(質問のコンテキストでは、インストールする必要があると思います)およびcurl
またはのいずれかwget
。setuptools
バージョンをソートするためにパッケージがインストールされていることを前提としています(ほとんどの場合、インストールされています)。次のような外部の依存関係には依存しません。
jq
存在しない可能性があります。grep
そしてawk
それは、LinuxとMacOSで動作が異なる場合があります。curl --silent --location https://pypi.org/pypi/requests/json | python -c "import sys, json, pkg_resources; releases = json.load(sys.stdin)['releases']; print(' '.join(sorted(releases, key=pkg_resources.parse_version)))"
コメント付きの少し長いバージョン。
パッケージ名を変数に入れます:
PACKAGE=requests
バージョンを取得(を使用curl
):
VERSIONS=$(curl --silent --location https://pypi.org/pypi/$PACKAGE/json | python -c "import sys, json, pkg_resources; releases = json.load(sys.stdin)['releases']; print(' '.join(sorted(releases, key=pkg_resources.parse_version)))")
バージョンを取得(を使用wget
):
VERSIONS=$(wget -qO- https://pypi.org/pypi/$PACKAGE/json | python -c "import sys, json, pkg_resources; releases = json.load(sys.stdin)['releases']; print(' '.join(sorted(releases, key=pkg_resources.parse_version)))")
ソートされたバージョンを印刷する:
echo $VERSIONS
私の見解は、いくつかの投稿された回答を組み合わせたもので、実行中のpython環境内から簡単に使用できるようにいくつかの変更が加えられています。
アイデアは、使用するパッケージファインダーのインスタンスを提供する完全に新しいコマンド(installコマンドをモデルにしたもの)を提供することです。良い点は、pipがサポートし、ローカルのpip構成ファイルを読み取るすべてのインデックスで機能し、使用するため、通常のpipインストールの場合と同じように正しい結果が得られることです。
私はそれをpip v 9.xと10.xの両方と互換性があるようにしようとしましたが、9.xでのみ試しました
https://gist.github.com/kaos/68511bd013fcdebe766c981f50b473d4
#!/usr/bin/env python
# When you want a easy way to get at all (or the latest) version of a certain python package from a PyPi index.
import sys
import logging
try:
from pip._internal import cmdoptions, main
from pip._internal.commands import commands_dict
from pip._internal.basecommand import RequirementCommand
except ImportError:
from pip import cmdoptions, main
from pip.commands import commands_dict
from pip.basecommand import RequirementCommand
from pip._vendor.packaging.version import parse as parse_version
logger = logging.getLogger('pip')
class ListPkgVersionsCommand(RequirementCommand):
"""
List all available versions for a given package from:
- PyPI (and other indexes) using requirement specifiers.
- VCS project urls.
- Local project directories.
- Local or remote source archives.
"""
name = "list-pkg-versions"
usage = """
%prog [options] <requirement specifier> [package-index-options] ...
%prog [options] [-e] <vcs project url> ...
%prog [options] [-e] <local project path> ...
%prog [options] <archive url/path> ..."""
summary = 'List package versions.'
def __init__(self, *args, **kw):
super(ListPkgVersionsCommand, self).__init__(*args, **kw)
cmd_opts = self.cmd_opts
cmd_opts.add_option(cmdoptions.install_options())
cmd_opts.add_option(cmdoptions.global_options())
cmd_opts.add_option(cmdoptions.use_wheel())
cmd_opts.add_option(cmdoptions.no_use_wheel())
cmd_opts.add_option(cmdoptions.no_binary())
cmd_opts.add_option(cmdoptions.only_binary())
cmd_opts.add_option(cmdoptions.pre())
cmd_opts.add_option(cmdoptions.require_hashes())
index_opts = cmdoptions.make_option_group(
cmdoptions.index_group,
self.parser,
)
self.parser.insert_option_group(0, index_opts)
self.parser.insert_option_group(0, cmd_opts)
def run(self, options, args):
cmdoptions.resolve_wheel_no_use_binary(options)
cmdoptions.check_install_build_global(options)
with self._build_session(options) as session:
finder = self._build_package_finder(options, session)
# do what you please with the finder object here... ;)
for pkg in args:
logger.info(
'%s: %s', pkg,
', '.join(
sorted(
set(str(c.version) for c in finder.find_all_candidates(pkg)),
key=parse_version,
)
)
)
commands_dict[ListPkgVersionsCommand.name] = ListPkgVersionsCommand
if __name__ == '__main__':
sys.exit(main())
出力例
./list-pkg-versions.py list-pkg-versions pika django
pika: 0.5, 0.5.1, 0.5.2, 0.9.1a0, 0.9.2a0, 0.9.3, 0.9.4, 0.9.5, 0.9.6, 0.9.7, 0.9.8, 0.9.9, 0.9.10, 0.9.11, 0.9.12, 0.9.13, 0.9.14, 0.10.0b1, 0.10.0b2, 0.10.0, 0.11.0b1, 0.11.0, 0.11.1, 0.11.2, 0.12.0b2
django: 1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.4.8, 1.4.9, 1.4.10, 1.4.11, 1.4.12, 1.4.13, 1.4.14, 1.4.15, 1.4.16, 1.4.17, 1.4.18, 1.4.19, 1.4.20, 1.4.21, 1.4.22, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.5.4, 1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11, 1.5.12, 1.6, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.6.5, 1.6.6, 1.6.7, 1.6.8, 1.6.9, 1.6.10, 1.6.11, 1.7, 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 1.7.9, 1.7.10, 1.7.11, 1.8a1, 1.8b1, 1.8b2, 1.8rc1, 1.8, 1.8.1, 1.8.2, 1.8.3, 1.8.4, 1.8.5, 1.8.6, 1.8.7, 1.8.8, 1.8.9, 1.8.10, 1.8.11, 1.8.12, 1.8.13, 1.8.14, 1.8.15, 1.8.16, 1.8.17, 1.8.18, 1.8.19, 1.9a1, 1.9b1, 1.9rc1, 1.9rc2, 1.9, 1.9.1, 1.9.2, 1.9.3, 1.9.4, 1.9.5, 1.9.6, 1.9.7, 1.9.8, 1.9.9, 1.9.10, 1.9.11, 1.9.12, 1.9.13, 1.10a1, 1.10b1, 1.10rc1, 1.10, 1.10.1, 1.10.2, 1.10.3, 1.10.4, 1.10.5, 1.10.6, 1.10.7, 1.10.8, 1.11a1, 1.11b1, 1.11rc1, 1.11, 1.11.1, 1.11.2, 1.11.3, 1.11.4, 1.11.5, 1.11.6, 1.11.7, 1.11.8, 1.11.9, 1.11.10, 1.11.11, 1.11.12, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4