From fb9b81bdecd8eafa480c6a61d9baec2f1609d9ec Mon Sep 17 00:00:00 2001 From: expressgy Date: Mon, 1 Jul 2024 13:27:22 +0800 Subject: [PATCH] first commit --- .gitignore | 30 ++++++++++++++ README.md | 73 ++++++++++++++++++++++++++++++++++ package.json | 14 +++++++ packages/packageA/index.js | 1 + packages/packageA/package.json | 13 ++++++ packages/packageB/index.js | 1 + packages/packageB/package.json | 16 ++++++++ packages/tools/index.js | 3 ++ packages/tools/package.json | 13 ++++++ packages/tools/src/a.js | 1 + packages/web/index.js | 8 ++++ packages/web/package.json | 19 +++++++++ pnpm-lock.yaml | 31 +++++++++++++++ pnpm-workspace.yaml | 3 ++ scripts/preinstall.js | 5 +++ 15 files changed, 231 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 package.json create mode 100644 packages/packageA/index.js create mode 100644 packages/packageA/package.json create mode 100644 packages/packageB/index.js create mode 100644 packages/packageB/package.json create mode 100644 packages/tools/index.js create mode 100644 packages/tools/package.json create mode 100644 packages/tools/src/a.js create mode 100644 packages/web/index.js create mode 100644 packages/web/package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 scripts/preinstall.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f618c5 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# Monorepo的使用方法 + +1. 安装pnpm + +```bash +npm i -g pnpm +``` + +2. 新建monorepo项目 + +```bash +mkdir monorepo-project +``` + +3. 初始化项目 + +```bash +# pnpm init 现在不能使用-y +cd monorepo-project +pnpm init +``` + +4. 新建workspace定义文件 + +> 参考官网给出的例子 `https://pnpm.io/zh/pnpm-workspace_yaml` + +```bash +echo "packages: + - 'packages/*'" > pnpm-workspace.yaml +``` + +5. 在packages下建项目(因为上免得文件声明的是`packages`,你也可以建立其他的目录后声明) + +```bash +cd packages +mkdir projectA +mkdir projectB +# 开始初始化各个项目 +``` + +6. 各个项目互相引用 + +*第一次不要使用`pnpm add`,在子项目的package.json中,直接写依赖* + +```json +{ + "dependencies": { + "tools": "workspace:*", + } +} +``` + +*后面可以在主项目目录使用`pnpm add 像添加的依赖包名 --filter 给那个项目添加`* + +7. 引用完了记得在主项目构建`pnpm i` + +8. 启动项目 + +```bash +# pnpm run -C packages/web dev +pnpm run -C packages/子项目路径 子项目中的启动命令 +``` + +> scripts中的文件的意思是禁用npm +> 在package.json中添加这条命令 `"preinstall": "node ./scripts/preinstall.js"` + +```js +if(!/pnpm/.test(process.env.npm_execpath || '')) { + console.log('只能使用pnpm'); + console.warn() + process.exit(1) +} +``` diff --git a/package.json b/package.json new file mode 100644 index 0000000..4d28af4 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "monos", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "preinstall": "node ./scripts/preinstall.js" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/packages/packageA/index.js b/packages/packageA/index.js new file mode 100644 index 0000000..91e9313 --- /dev/null +++ b/packages/packageA/index.js @@ -0,0 +1 @@ +export const name = 'package-a'; \ No newline at end of file diff --git a/packages/packageA/package.json b/packages/packageA/package.json new file mode 100644 index 0000000..9d88e57 --- /dev/null +++ b/packages/packageA/package.json @@ -0,0 +1,13 @@ +{ + "name": "packageA", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/packages/packageB/index.js b/packages/packageB/index.js new file mode 100644 index 0000000..5ac3e90 --- /dev/null +++ b/packages/packageB/index.js @@ -0,0 +1 @@ +export const ace = 'packageB'; \ No newline at end of file diff --git a/packages/packageB/package.json b/packages/packageB/package.json new file mode 100644 index 0000000..d147e5c --- /dev/null +++ b/packages/packageB/package.json @@ -0,0 +1,16 @@ +{ + "name": "packageB", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "packageA": "workspace:*" + } +} diff --git a/packages/tools/index.js b/packages/tools/index.js new file mode 100644 index 0000000..3fd5c3c --- /dev/null +++ b/packages/tools/index.js @@ -0,0 +1,3 @@ +const name = 'tools'; + +export default name \ No newline at end of file diff --git a/packages/tools/package.json b/packages/tools/package.json new file mode 100644 index 0000000..91e2e53 --- /dev/null +++ b/packages/tools/package.json @@ -0,0 +1,13 @@ +{ + "name": "tools", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/packages/tools/src/a.js b/packages/tools/src/a.js new file mode 100644 index 0000000..927ebea --- /dev/null +++ b/packages/tools/src/a.js @@ -0,0 +1 @@ +export const a = 'AAA-C' \ No newline at end of file diff --git a/packages/web/index.js b/packages/web/index.js new file mode 100644 index 0000000..af55306 --- /dev/null +++ b/packages/web/index.js @@ -0,0 +1,8 @@ +import tools from "tools"; +import {a} from "tools/src/a.js"; +import { name } from "packageA"; +import { ace } from "ace"; +console.log(tools) +console.log(a) +console.log(name) +console.log(ace) \ No newline at end of file diff --git a/packages/web/package.json b/packages/web/package.json new file mode 100644 index 0000000..53b2c25 --- /dev/null +++ b/packages/web/package.json @@ -0,0 +1,19 @@ +{ + "name": "web", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "node index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "tools": "workspace:*", + "packageA": "workspace:*", + "ace": "workspace:packageB@1.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c3f0c2c --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,31 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + packages/packageA: {} + + packages/packageB: + dependencies: + packageA: + specifier: workspace:* + version: link:../packageA + + packages/tools: {} + + packages/web: + dependencies: + ace: + specifier: workspace:packageB@1.0.0 + version: link:../packageB + packageA: + specifier: workspace:* + version: link:../packageA + tools: + specifier: workspace:* + version: link:../tools diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..d6d0607 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + # all packages in direct subdirs of packages/ + - 'packages/*' \ No newline at end of file diff --git a/scripts/preinstall.js b/scripts/preinstall.js new file mode 100644 index 0000000..f17168f --- /dev/null +++ b/scripts/preinstall.js @@ -0,0 +1,5 @@ +if(!/pnpm/.test(process.env.npm_execpath || '')) { + console.log('只能使用pnpm'); + console.warn() + process.exit(1) +} \ No newline at end of file