在可行的情况下,我喜欢在版本控制下拥有构建所需的工具。理想的情况是,新的结帐将在任何一台机器上运行,并且首先需要安装最少的工具集。
将 Python 置于版本控制之下是否可行?
python包呢?由于对 Docutils 的依赖,我在不安装 Sphinx 的情况下尝试使用它的天真尝试失败了。有没有办法不用安装就可以使用?
在可行的情况下,我喜欢在版本控制下拥有构建所需的工具。理想的情况是,新的结帐将在任何一台机器上运行,并且首先需要安装最少的工具集。
将 Python 置于版本控制之下是否可行?
python包呢?由于对 Docutils 的依赖,我在不安装 Sphinx 的情况下尝试使用它的天真尝试失败了。有没有办法不用安装就可以使用?
查看virtualenv和buildout以满足这些需求。
virtualenv
允许您将运行项目的 Python 与使用该版本的 Python 安装的任何其他包隔离开来。因此,如果您的项目需要 Python xy,唯一的先决条件是您需要确保系统上存在该 Python 版本的副本。您在其中安装的任何软件包virtualenv
都与在其外部安装的软件包完全隔离。
buildout
允许您指定包依赖项,因此如果您需要sphinx
构建文档,只需将其包含在buildout.cfg
文件中:
parts =
sphinx
[sphinx]
recipe = collective.recipe.sphinxbuilder
当你运行buildout
它时,它将安装collective.recipe.sphinxbuilder
、下载和安装docutils
,并sphinx
在其中virtualenv
构建你的文档。
您可以包括从包含和文件buildout.cfg
的文件夹的初始签出开始运行系统所需的所有依赖项。它使设置系统进行开发或最终部署变得非常容易。buildout.cfg
bootstrap.py
不,就像编译器一样,python 解释器应该安装在系统范围内。同样的事情也适用于 sphinx 和 docutils 等工具(很可能在通过发行版的包管理器安装 sphinx 时安装)。
这同样适用于大多数 python 包,尤其是那些由应用程序本身使用并通过 PyPi 可用的包。
与许多应用程序一样,Python 不会在签出项目的任何地方“就地”运行 - 它们需要添加到路径并了解一些设置。这就是为什么它们要么是平台的一部分(Mac 和 Linux),要么需要一个成熟的安装程序(Windows)。
考虑到这一点,最好不要将 Python 本身包含在存储库中——您仍然必须为平台选择正确的二进制安装程序并运行安装程序。然后,如果您更新版本存储库中的版本,则必须升级目标系统。毕竟,您几乎肯定不会拥有一致的系统——因此首先破坏了将 Python 用于版本控制的意义。
良好的版本控制和依赖管理确实需要保留特定版本的工具。Setuptools 包括easy_install,这使得这很容易:
easy_install "pytest==2.2.4"
请注意特定版本 - 如果您不太担心特定版本,则可以省略它,或者您可以指定最小值:
easy_install "pytest>2.2"
(注意:还有其他类似的工具,包括 pip)
默认情况下,您将从 Pypi 加载,这会将所有历史版本保存在它的存储库中。除非您真的担心缺少特定版本,否则这很好。如果数百万美元或生命危在旦夕,请将该工具签入您的本地存储库并使用 easy_install(或类似工具)进行安装。
我强烈推荐使用virtualenv项目来虚拟化你的 Python 环境。这样做可以让您创建一个沙箱,easy_install 在其中安装库和工具,从而将您与系统上意外安装的任何其他工具隔离开来。Virtualenv 还可以管理特定版本的 Python。
另一种想法:如果复制特定环境用于构建/测试目的是重点,那么考虑使用云/操作系统虚拟化方法,例如 VirtualBox、VMWare 或类似方法。您可以在许多不同的机器上运行完全相同的操作系统映像。
一般来说,您的版本控制应该包含您的项目。将您的依赖项也包含在其中几乎总是一个坏主意,除非您已做出明确的策略决定始终针对它们进行静态链接(对于解释代码,这涉及将它们保留在源代码树中)。听起来您想要的是Zero install,一个启动时依赖注入器。它本质上允许您获得静态链接的好处(如果您不能/不想进入每个相关的包管理器存储库,您的用户不需要安装您的依赖项)而没有缺点(您的用户最终会得到多个可能不同步的常见依赖项版本)。
当您想向非技术用户交付工具而不要求他们安装任何东西时,您可以将 python 放入 scm。从理论上讲,您可以设置一些其他工具并让它们都安装它,这样您就可以确保它们每次同步时都运行pip install -r requirements.txt
并获取所有依赖项,但这并不总是那么容易。如果您在使用 python 时遇到阻力(“它没有编译;每个人都必须安装 python”),那么将 python 放入 scm 是您的最佳选择!
如果你使用的是 Linux/Unix,你可能会使用内置的包管理器,所以我假设你使用的是 Windows。(注意:有适用于 Windows 的包管理器,例如 scoop、choco 和 winget——它们值得一看。)
将 python 放入 scm 有两种选择:
阅读有关此软件包的更多信息,了解为什么有这么多 python 安装程序。
如果您想要最小的 python 并手动提供包(不使用 pip),这应该是一个好方法。从理论上讲,您也可以设置自己安装软件包 。但是,如果您希望团队中的任何开发人员都能够安装软件包,这可能不是一个好的选择。
常规的 python 安装。但我们会做一些不同的事情。
*.pyc
和__pycache__
C:\python3
C:\python3
到您的项目中:c:\proj\tools\python3
C:\python3
c:\proj\tools\pymodules
__init__.py
文件:c:\proj\tools\pymodules\__init__.py
c:\proj\tools\python3\site-packages\work.pth
../../../pymodules
python -m http.server 8000 --directory .
或其他一些 python 代码,以便您可以仔细检查您的忽略是否正确。现在您将能够使用 pip 安装新软件包并将它们提交到源代码管理。如果您创建pymodules\work\__init__.py
(空)和pymodules\work\example.py
:
print('Hello from example.py')
你可以运行它:
c:\proj\tools\python3\python.exe -m work.example
并导入它:
import work.example
没有弄乱路径!
但是,您可能需要确保所有用户都直接运行 python.exe 并且不能假定它在他们的 PATH 中。但是,既然您知道它在他们的项目中的位置,那么这不太可能是个问题。您可以创建一键式批处理文件,根据其路径确定 python 的路径:
%~dp0\..\..\python3\python.exe -m work.example
多年来,我们在我的工作中一直使用这种设置,最近我在一个新项目中使用上述步骤进行了设置。我们在 svn 中有我们的项目,它工作得很好,但是将这么多文件转储到 git 中可能不太理想。