nor*_*orr 8 javascript lerna monorepo nrwl-nx
我有/frontend(JS/Vue)和/backend(PHP)的存储库docker-compose.yml用于开发。但现在我需要添加另一个 JS 前端,该前端将共享一些组件、库等。我不想重复代码,所以我发现我可以使用许多工具来实现此目的,例如lerna、nx等turborepo,用于使用共享包管理 monorepo。
问题是我发现的所有教程和示例存储库都基于 100% JS 存储库,例如前面的 React + 后面的 Nest 等。
所以问题-用于前。nx在具有多种语言的存储库上有意义,只是为了在 JS 包上利用它?如果是,目录结构应该是什么样子?或者也许有更好的 monorepo 工具是为多种语言设计的,而不仅仅是 JS?
Sal*_*ani 14
我在 Nx monorepo 中使用 Angular 和 PHP(Yii 框架),两者都工作正常。不知道 Lerna 和 Turborepo 是如何工作的,但 Nx 允许运行 CLI 命令,我将其用于 PHP 部分。我的 monorepo 看起来有点如下:
- 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
Run Code Online (Sandbox Code Playgroud)
主要思想是,我编写的每个代码都位于该libs文件夹(JS 的 libs/web 和 PHP 的 libs/php)和生成的 Nx 库中,因此它有一个名称(如php-api)可以从任何地方链接它,并且有一个project.json文件保存Nx 配置。
这是我的基本共享代码。一次编写,适用于任何需要它的项目或库。
libs/project-2然后将保存项目 2 的特定代码。仅在该应用程序页面内共享的内容以及我从前面提到的文件夹(或以前的共享层)覆盖的内容,如上面的按钮示例。
里面的代码apps尽可能小,主要是布局和配置。这几乎就是大多数 Nx 文档/教程的建议(对于 JS)。我对 PHP 也做了同样的事情:
libs/php/apilibs/project-2/apiapps/project-2/apiproject.json定义它的文件:{
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"projectType": "library",
"sourceRoot": "libs/php/api",
"tags": ["scope:php", "type:api"]
}
Run Code Online (Sandbox Code Playgroud)
angular.js就我而言,使用 Angular,根级别有一个文件,我在其中声明了每个 PHP 库名称,以便 Nx 检测到它,我只需添加 2 行"php-api": "libs/php/api":"project-2-api": "libs/project-2/api",
在apps/project-2/api文件夹内,我添加了一个project.json包含以下内容的文件:
{
"$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"]
}
Run Code Online (Sandbox Code Playgroud)
它定义了构建和服务脚本,因此我可以使用 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执行器来执行诸如移动文件、实时构建或部署之类的操作。
我使用 VSCode,其他 IDE 可能也有类似的方式,在我的例子中,我使用一个名为run-on-save的外部扩展,它在基于提供的正则表达式保存文件时执行命令。我的项目的配置看起来有点如下:
"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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
每次我按 CTR+S 保存 PHP 文件时,dist文件夹都会自动更新。
| 归档时间: |
|
| 查看次数: |
3758 次 |
| 最近记录: |