4

我有的

我有 2 个共享一些代码的 python 应用程序,足以让我尝试将共享部分隔离到模块/包/库中(我故意使术语含糊不清,因为我不确定解决方案是什么) . 我所有的代码都在一个 monorepo 中,因为我希望克服管理比团队成员更多的 repo 的一些烦恼。

目前我的文件布局如下:

+ myproject
  + appA
  | + python backend A
  | + js frontend
  + appB
  | + B stuff
  + libs
    + lib1
    + lib2

两者都appA使用appBand lib1lib2它们本质上是抽象共享数据库的数据模型)。appA是一个有几个组件的webapp,并不是所有的都是python。它被部署为一个涉及一堆容器的 docker 堆栈。我用诗歌管理我的依赖关系,以确保可重现的构建等......每个python组件(appAappB......)都有自己的pyproject.toml文件,虚拟环境等......

appB是单独部署的。

如果有什么不同的话,所有的开发都在 linux 上。

我需要的

我正在寻找一种干净的方式来处理库:

  • 的开发appA是在本地docker-compose设置中完成的。后端在文件更改时自动重新加载(使用 docker 卷),我希望它也发生在库中的更改上。
  • 开发appB更简单,但正在转移到 docker,所以问题是一样的。

我试过的

  • 我最初的“解决方案”是将 libs 文件夹复制到一个临时位置以便在appA. 它适用于导入,但是一旦我想更改库代码(这仍然很常见),它就会很混乱,因为我需要更改原始文件,复制,重建容器。
  • 我尝试将库符号链接到后端的 docker 环境中,但符号链接似乎不适用于 docker(它似乎没有跟随链接,因此文件不会最终出现在 docker 映像中,除非我基本上复制了docker build 上下文中的文件,这违背了链接的目的。)
  • 我已经尝试将每个库打包到一个 python 包中,并通过poetry add ../../libs/lib1它在 docker 中安装它们,因为路径不匹配,然后我回到了符号链接问题。

我确信有一种干净的方法可以做到这一点,但我无法弄清楚。我知道我可以将 repo 分解成更小的 repo 并安装依赖项,但是开发仍然会在 docker 内部引起问题,因为每次更改 lib 文件时我仍然需要重建容器,所以我宁愿保留 monorepo。

4

1 回答 1

1

如果您仍然使用 docker-compose,您可以使用卷在您的容器中安装本地库,并能够在您的主机系统和容器中编辑它们。不是超级花哨,但这应该有效,对吧?

@ckaseer 你的建议似乎确实有效。简而言之,在 docker 文件中,我执行 COPY ../libs/lib1 /app/lib1,然后为了进行本地开发,我将 ../libs/lib1 挂载到 /app/lib1 上。这给了我我正在寻找的行为。我为此使用了一个拆分的 docker-compose 文件。该设置会导致需要一些额外配置的各种工具出现一些问题,因此他们知道库是代码库的一部分,但没有什么不可能的。谢谢你的主意!

因此,即使它不是本地安装在应用程序和 lib 目录上的理想解决方案,也适用于 Linux 系统。

仅供参考:在 Windows 主机上,如果您想监视文件更改,则可能会遇到麻烦,因为文件更改不会从 Windows 主机传播到 Linux 容器。

于 2020-02-26T20:10:40.107 回答