pnpm -F @opentiny/tiny-engine-controller -F @opentiny/tiny-engine-dsl-vue build 这个命令的作用是什么
pnpm -F @opentiny/tiny-engine-controller -F @opentiny/tiny-engine-dsl-vue build
命令的作用是使用 pnpm
包管理器对指定的工作区包进行构建。具体来说:
pnpm
:这是 Node.js 的包管理器,类似于npm
,但更高效,支持工作区(workspace)管理。-F
或--filter
:这是一个选项,用于筛选特定的工作区包。你可以通过包名来指定要操作的包。@opentiny/tiny-engine-controller
和@opentiny/tiny-engine-dsl-vue
:这是你要操作的两个工作区包的名称。build
:这是要执行的命令,通常用于构建项目。
命令详解
-
pnpm
:pnpm
是一个高性能的包管理器,它通过使用内容可寻址的存储来减少磁盘上的重复文件,从而提高性能。
-
-F
或--filter
:- 这个选项允许你指定要操作的工作区包。你可以通过包名来过滤,只对特定的包执行命令。
- 在这个命令中,
-F @opentiny/tiny-engine-controller -F @opentiny/tiny-engine-dsl-vue
表示只对@opentiny/tiny-engine-controller
和@opentiny/tiny-engine-dsl-vue
这两个包执行后续的build
命令。
-
build
:- 这是一个常见的构建命令,通常定义在
package.json
文件的scripts
部分。 - 例如,
package.json
中可能有一个build
脚本,如下所示:{ "scripts": { "build": "rollup -c" } }
- 当你运行
pnpm build
时,pnpm
会执行rollup -c
命令(假设build
脚本是这样定义的)。
- 这是一个常见的构建命令,通常定义在
综合解释
pnpm -F @opentiny/tiny-engine-controller -F @opentiny/tiny-engine-dsl-vue build
命令的作用是:
- 只对
@opentiny/tiny-engine-controller
和@opentiny/tiny-engine-dsl-vue
这两个工作区包执行build
命令。 - 这些包的
build
脚本会在各自的package.json
文件中定义,通常是用于编译、打包或其他构建任务。
pnpm-workspace.yaml
packages:
- 'packages/**'
- 'mockServer'
# 忽略测试文件夹中的 project
- '!packages/**/test/**'
lint-staged.config.js
module.exports = {
'./packages/**/**.{js,vue,jsx}': 'eslint',
'./packages/**/**.{vue,js,ts,html,json,less}': 'prettier --write'
}
lerna.json
{
"command": {
"version": {
"message": "chore(release): publish"
}
},
"useNx": false,
"version": "independent",
"npmClient": "pnpm",
"publish": {
"npmClient": "pnpm"
},
"ignoreChanges": ["**/*.md", "**/test/**", ".npmrc"],
"granularPathspec": false
}
jsconfig.json
{
"compilerOptions": {
"baseUrl": "./",
"jsx": "react",
"paths": {
"@/*": ["packages/*"],
"@opentiny/tiny-engine-canvas": ["packages/canvas/src/index.js"],
"@opentiny/tiny-engine-controller": ["packages/controller/src/index"],
"@opentiny/tiny-engine-plugin-materials": ["packages/plugins/materials/index"],
"@opentiny/tiny-engine-plugin-data": ["packages/plugins/data/index"],
"@opentiny/tiny-engine-plugin-script": ["packages/plugins/script/index"],
"@opentiny/tiny-engine-plugin-tree": ["packages/plugins/tree/index"],
"@opentiny/tiny-engine-plugin-help": ["packages/plugins/help/index"],
"@opentiny/tiny-engine-plugin-schema": ["packages/plugins/schema/index"],
"@opentiny/tiny-engine-plugin-page": ["packages/plugins/page/index"],
"@opentiny/tiny-engine-plugin-i18n": ["packages/plugins/i18n/index"],
"@opentiny/tiny-engine-plugin-bridge": ["packages/plugins/bridge/index"],
"@opentiny/tiny-engine-i18n-host": ["packages/i18n/src/lib"]
}
},
"include": ["packages/**/*"],
"exclude": ["node_modules", "dist"]
}
.npmignore
.build_config
.cid
.codecheck
.husky
.vscode
# 只忽略根目录的 dist 文件夹
/dist
test
node_modules
.editorconfig
.eslintignore
.eslintrc.js
.prettierignore
.prettierrc
jsconfig.json
package-lock.json
# 忽略可能存在的其它编辑器文件夹
.idea
/packages/design-core/public/mock/*
**/**/tmp
**/**/temp
logger.mjs
import colors from 'picocolors'
class Logger {
constructor(command) {
this.command = command
}
output(type, msg) {
const format = () => {
const colorMap = {
info: 'cyan',
warn: 'yellow',
error: 'red',
success: 'green'
}
const time = new Date().toLocaleTimeString()
const colorMsg = colors[colorMap[type]](type)
return `[${this.command}] [${colors.dim(time)}] ${colorMsg} ${msg}`
}
// eslint-disable-next-line no-console
return console.log(format())
}
info(msg) {
this.output('info', msg)
}
warn(msg) {
this.output('warn', msg)
}
error(msg) {
this.output('error', msg)
}
success(msg) {
this.output('success', msg)
}
}
export default Logger
使用
import Logger from './logger.mjs'
const logger = new Logger('splitMaterials')
logger.success('materials splitted.')
logger.error(`failed to split materials: ${error}.`)
文件名转换
const capitalize = (str) => `${str.charAt(0).toUpperCase()}${str.slice(1)}`
const toPascalCase = (str) => str.split('-').map(capitalize).join('')
copyToVscode.js
const path = require('path')
const fse = require('fs-extra')
const removeDir = (dir) => {
if (fse.existsSync(dir)) {
fse.removeSync(dir)
}
}
const moveDir = (src, dest) => {
if (fse.existsSync(src)) {
fse.moveSync(src, dest, {
overwrite: true
})
}
}
const copyDir = (src, dest) => {
if (fse.existsSync(src)) {
fse.copySync(src, dest, {
overwrite: true
})
}
}
const run = () => {
const vscodeDir = path.resolve('/Tiny/lowcode-vscode/packages/vsix-crm/project/public/editor')
moveDir(path.join(__dirname, '../dist/editor/monaco-workers'), path.join(__dirname, '../dist/monaco-workers'))
removeDir(path.join(__dirname, '../dist/angular'))
removeDir(path.join(__dirname, '../dist/editor'))
removeDir(path.join(__dirname, '../dist/img-crm'))
removeDir(path.join(__dirname, '../dist/mock'))
removeDir(vscodeDir)
copyDir(path.join(__dirname, '../dist'), vscodeDir)
}
run()
从 .env.local 中读取配置
// 先构造出.env*文件的绝对路径
const appDirectory = fs.realpathSync(process.cwd())
const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath)
const pathsDotenv = resolveApp('.env')
// 加载.env.local
dotenv.config({ path: `${pathsDotenv}.local` })
const { SQL_HOST, SQL_PORT, SQL_USER, SQL_PASSWORD, SQL_DATABASE } = process.env