我有用于开发的/frontend (JS/Vue)、/backend (PHP)和docker-compose.yml的存储库。但是现在我需要添加另一个JS前端,它将共享一些组件、库等等。我不想重复代码,所以我发现我可以为此使用许多工具,比如lerna、nx、turborepo以及更多的工具来管理带有共享包的monorepo。
问题是,我发现的所有教程和示例repos都是基于100%的JS repos,比如前面的React +背面的Nest等等。
所以问题-用在前男友身上。nx在使用多种语言的repos上有意义,只是为了在JS包上利用它?如果是,目录结构应该是什么样的?或者也许有更好的monorepo工具是为多种语言而设计的,而不仅仅是JS?
发布于 2022-06-22 14:46:14
我在Nx中使用了角和PHP (),两者都工作得很好。不知道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 主要思想是,我编写的每一段代码都在libs文件夹中(用于JS的libs/web和用于PHP的libs/ PHP ),以及在生成的Nx库中,因此它有一个名称(比如php-api)来链接它,并且有一个包含Nx的project.json文件。
这是我的基本共享代码。为任何需要它的项目或库编写一次。
然后libs/project-2将保存项目-2特定代码。只有在应用程序页面中共享的内容,再加上我从前面提到的文件夹(或前面的共享层)重写的内容,如上面的按钮示例。
apps内部的代码尽可能小,主要是布局和信任。这就是大多数Nx文档/教程所建议的(对于JS)。我对PHP也是这样做的:
libs/php/apilibs/project-2/api中apps/project-2/api内部project.json文件来定义它:{
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"projectType": "library",
"sourceRoot": "libs/php/api",
"tags": ["scope:php", "type:api"]
}angular.js文件,我声明了每个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"]
}它定义了构建脚本和服务脚本,因此我可以使用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保存文件时执行命令。它对我的项目的配置看上去有点像以下所示:
"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文件夹就会自动更新。
https://stackoverflow.com/questions/71370835
复制相似问题