首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lerna / Nx / Turborepo或其他用于非js应用程序(php)的monorepo系统

Lerna / Nx / Turborepo或其他用于非js应用程序(php)的monorepo系统
EN

Stack Overflow用户
提问于 2022-03-06 13:48:01
回答 1查看 1.5K关注 0票数 5

我有用于开发的/frontend (JS/Vue)、/backend (PHP)和docker-compose.yml的存储库。但是现在我需要添加另一个JS前端,它将共享一些组件、库等等。我不想重复代码,所以我发现我可以为此使用许多工具,比如lernanxturborepo以及更多的工具来管理带有共享包的monorepo。

问题是,我发现的所有教程和示例repos都是基于100%的JS repos,比如前面的React +背面的Nest等等。

所以问题-用在前男友身上。nx在使用多种语言的repos上有意义,只是为了在JS包上利用它?如果是,目录结构应该是什么样的?或者也许有更好的monorepo工具是为多种语言而设计的,而不仅仅是JS?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-22 14:46:14

我在Nx中使用了角和PHP (),两者都工作得很好。不知道Lerna和Turborepo是如何工作的,但是Nx允许运行CLI命令,我将其用于PHP部分。我的monorepo看起来有点像:

代码语言:javascript
复制
- apps // <- folder holding my projects
--- project-1
--- project-2
------ web // <- Main frontend app (Angular/JS)
------ electron // <- other JS apps like mobile, capacitor, extension, ...
------ api // <- PHP api overridden config files

- libs
--- web // <- shared JS stuff, most people call it 'shared' folder instead
------ ui // <- my shared design system
--- electron
--- project-2 // <- specific project overrides and locally shared stuff
------ services
------ data-access 
------ ui
--------- button // <- overriding a component from my design system to only apply in project-2
------ api // <- PHP api but only holding overridden files
--- php
------ api // <- shared PHP api code
------ auth // <- another shared PHP app
------ shell // <- another shared PHP app

- dist // <- is where NX will will put all generated code from all apps/libs 

主要思想是,我编写的每一段代码都在libs文件夹中(用于JS的libs/web和用于PHP的libs/ PHP ),以及在生成的Nx库中,因此它有一个名称(比如php-api)来链接它,并且有一个包含Nx的project.json文件。

这是我的基本共享代码。为任何需要它的项目或库编写一次。

然后libs/project-2将保存项目-2特定代码。只有在应用程序页面中共享的内容,再加上我从前面提到的文件夹(或前面的共享层)重写的内容,如上面的按钮示例。

apps内部的代码尽可能小,主要是布局和信任。这就是大多数Nx文档/教程所建议的(对于JS)。我对PHP也是这样做的:

  1. 我把我所有的Yii代码都放进了libs/php/api
  2. 项目特有的一切-2应用程序(比如模型、控制器、.)文件夹和/或文件在libs/project-2/api
  3. 主配置文件(如.env)位于apps/project-2/api内部
  4. 每个lib文件夹都需要一个project.json文件来定义它:
代码语言:javascript
复制
{
  "$schema": "../../../node_modules/nx/schemas/project-schema.json",
  "projectType": "library",
  "sourceRoot": "libs/php/api",
  "tags": ["scope:php", "type:api"]
}
  1. 在我的例子中,使用角,有一个根级的angular.js文件,我声明了每个PHP名称以便Nx检测到它,我只添加了2行:"php-api": "libs/php/api""project-2-api": "libs/project-2/api",
  2. apps/project-2/api文件夹中,我添加了一个具有以下内容的project.json文件:
代码语言:javascript
复制
{
  "$schema": "../../../node_modules/nx/schemas/project-schema.json",
  "projectType": "application",
  "sourceRoot": "apps/project-2/api",
  "targets": {
    "build": {
      "executor": "nx:run-commands",
      "options": {
        "commands": [
          "mkdir -p dist/apps/project-2",
          "rsync -rtul libs/php/api dist/apps/project-2",
          "rsync -rtul libs/project-2/api dist/apps/project-2",
          "rsync -rtul apps/project-2/api dist/apps/project-2"
        ],
        "parallel": false
      }
    },
    "serve": {
      "executor": "nx:run-commands",
      "dependsOn": ["build"],
      "options": {
        "commands": ["php -S localhost:8081 -t dist/apps/project-2/api/web"]
      }
    }
  },
  "implicitDependencies": ["php-api"]
}

它定义了构建脚本和服务脚本,因此我可以使用Nx cli运行它们,第一个脚本只将PHP文件复制到dist文件夹(尊重我的覆盖层次结构),而第二个脚本使用PHP的内置服务器为最终文件夹服务:

> nx run project-2-api:build

> nx run project-2-api:serve

请注意,我的第一个脚本使用rsync -rtul复制文件,您可以使用cp -R,我发现rsync速度快得多,因为它具有跳过未更改文件的能力(有这些选项)。

所以主要的想法是,我的大部分代码只编写一次,在需要时重写,一个单一的设计系统,我只是用一个新的应用程序覆盖它的CSS以获得不同的外观。对于PHP,我也是这样做的,即使不是直接支持的,我也只是使用nx:run-commands执行器来处理诸如移动文件、构建或部署live之类的事情。

保存时自动更新

我使用VSCode,其他IDE也可能有类似的方式,在我的例子中,我使用一个名为在即存的外部扩展名,它在根据提供的regex保存文件时执行命令。它对我的项目的配置看上去有点像以下所示:

代码语言:javascript
复制
"emeraldwalk.runonsave": {
    "commands": [
      {
        "match": "(/(project-2|php)/(api|yii-shared)/.+).php$",
        "cmd": "nx run project-2-api:build --skip-nx-cache"
      },
      {
        "match": "(/(project-2|php)/(auth|yii-shared)/.+).php$",
        "cmd": "nx run project-2-auth:build --skip-nx-cache"
      },
      {
        "match": "(/(project-2|php)/(shell|yii-shared)/.+).php$",
        "cmd": "nx run project-2-shell:build --skip-nx-cache"
      }
    ]
  }

每次我点击CTR+S来保存一个dist文件时,dist文件夹就会自动更新。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71370835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档