Typescript 意外标记“;“出口”;在docker容器中使用babel和docker compose并键入脚本monorepo
在过去的几天里,我一直在努力解决以下问题,似乎无法找到答案。我有一个带有共享包的类型脚本monorepo,我正试图使用docker compose在docker中开发它。我可以用纱线直接从本地机器上运行它们,一切都可以正常启动。但是,一旦我使用docker compose对它们进行docker化并使它们旋转起来,api就无法启动输出:Typescript 意外标记“;“出口”;在docker容器中使用babel和docker compose并键入脚本monorepo,typescript,docker-compose,babeljs,monorepo,yarn-workspaces,Typescript,Docker Compose,Babeljs,Monorepo,Yarn Workspaces,在过去的几天里,我一直在努力解决以下问题,似乎无法找到答案。我有一个带有共享包的类型脚本monorepo,我正试图使用docker compose在docker中开发它。我可以用纱线直接从本地机器上运行它们,一切都可以正常启动。但是,一旦我使用docker compose对它们进行docker化并使它们旋转起来,api就无法启动输出: /project/node_modules/@project/shared-components/index.ts:1 export * from './src'
/project/node_modules/@project/shared-components/index.ts:1
export * from './src';
^^^^^^
SyntaxError: Unexpected token 'export'
在我看来,巴贝尔不知何故失败了。docker compose文件执行我在本地使用的相同命令,并共享所有相同的配置文件。我还将每个docker容器的体积设置为包含我的包的工作区
文件结构
/project
/packages
/api
/shared-components
从工作区根目录运行命令
yarn install
yarn run dev
/project/package.json
...
"workspaces": {
"packages": [
"packages/*"
]
},
"scripts": {
...
"dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"scripts": {
...
"dev": "set NODE_ENV=development&& set NEW_RELIC_ENABLED=false&& nodemon -e js,ts,json --exec babel-node --config-file ../../babel.config.json --extensions .ts,.js ./src/index.ts",
}
{
"babelrcRoots": ["./packages/*"],
"presets": [
"@babel/preset-env",
"@babel/preset-typescript",
[
"minify",
{
"builtIns": false,
"evaluate": false,
"mangle": false
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"regenerator": true,
"corejs": 3
}
]
],
"ignore": ["**/*.test.ts", "**/*.test.tsx", "**/*.test.js", "**/*.test.jsx"]
}
{
"compilerOptions": {
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"noImplicitAny": false,
"allowSyntheticDefaultImports": true,
"noEmit": true,
"isolatedModules": true,
"declaration": true,
"downlevelIteration": true,
"rootDir": ".",
"baseUrl": ".",
"outDir": "./.ts",
"target": "ES5",
"module": "ESNext",
"moduleResolution": "node",
"paths": {
"@allido/*": ["./packages/*"]
}
},
"include": ["./.storybook/main.tsx", "./packages/**/*"],
"exclude": [
"./node_modules",
"./.storybook",
"**/node_modules",
"**/.next",
"**/.lib",
"**/out",
"**/.ts",
"**/*.test.ts",
"**/*.test.js"
]
}
/project/docker compose.yml
version: '3.8'
services:
api:
container_name: api
environment:
- NODE_ENV=development
volumes:
- './:/project'
build:
context: '.'
dockerfile: Dockerfile.dev
working_dir: /project/packages/api
entrypoint: ['yarn', 'run', 'dev']
ports:
- '3000:3000'
version: '3.8'
services:
api:
container_name: capi
environment:
- NODE_ENV=development
volumes:
- './packages/:/project/packages'
- /project/packages/api/node_modules/
build:
context: '.'
dockerfile: Dockerfile.dev
working_dir: /project/packages/api
entrypoint: ['../../entrypoint.dev.sh']
ports:
- '3000:3000'
/project/Dockerfile.dev
# configure container
FROM node:14
USER root
# configure container
FROM node:14
USER root
RUN mkdir /project
RUN chmod -R 777 /project
RUN chown -R node: /project
COPY ./*.json /project/
COPY ./.infrastructure/entrypoint.dev.sh /project/entrypoint.dev.sh
/project/packages/api/package.json
...
"workspaces": {
"packages": [
"packages/*"
]
},
"scripts": {
...
"dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"scripts": {
...
"dev": "set NODE_ENV=development&& set NEW_RELIC_ENABLED=false&& nodemon -e js,ts,json --exec babel-node --config-file ../../babel.config.json --extensions .ts,.js ./src/index.ts",
}
{
"babelrcRoots": ["./packages/*"],
"presets": [
"@babel/preset-env",
"@babel/preset-typescript",
[
"minify",
{
"builtIns": false,
"evaluate": false,
"mangle": false
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"regenerator": true,
"corejs": 3
}
]
],
"ignore": ["**/*.test.ts", "**/*.test.tsx", "**/*.test.js", "**/*.test.jsx"]
}
{
"compilerOptions": {
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"noImplicitAny": false,
"allowSyntheticDefaultImports": true,
"noEmit": true,
"isolatedModules": true,
"declaration": true,
"downlevelIteration": true,
"rootDir": ".",
"baseUrl": ".",
"outDir": "./.ts",
"target": "ES5",
"module": "ESNext",
"moduleResolution": "node",
"paths": {
"@allido/*": ["./packages/*"]
}
},
"include": ["./.storybook/main.tsx", "./packages/**/*"],
"exclude": [
"./node_modules",
"./.storybook",
"**/node_modules",
"**/.next",
"**/.lib",
"**/out",
"**/.ts",
"**/*.test.ts",
"**/*.test.js"
]
}
/project/packages/api/src/index.ts
require('@babel/register')({
rootMode: 'upward',
ignore: ['../../node_modules'],
extensions: ['.js', '.ts'],
});
require('./server');
/project/babel.config.json
...
"workspaces": {
"packages": [
"packages/*"
]
},
"scripts": {
...
"dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"scripts": {
...
"dev": "set NODE_ENV=development&& set NEW_RELIC_ENABLED=false&& nodemon -e js,ts,json --exec babel-node --config-file ../../babel.config.json --extensions .ts,.js ./src/index.ts",
}
{
"babelrcRoots": ["./packages/*"],
"presets": [
"@babel/preset-env",
"@babel/preset-typescript",
[
"minify",
{
"builtIns": false,
"evaluate": false,
"mangle": false
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"regenerator": true,
"corejs": 3
}
]
],
"ignore": ["**/*.test.ts", "**/*.test.tsx", "**/*.test.js", "**/*.test.jsx"]
}
{
"compilerOptions": {
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"noImplicitAny": false,
"allowSyntheticDefaultImports": true,
"noEmit": true,
"isolatedModules": true,
"declaration": true,
"downlevelIteration": true,
"rootDir": ".",
"baseUrl": ".",
"outDir": "./.ts",
"target": "ES5",
"module": "ESNext",
"moduleResolution": "node",
"paths": {
"@allido/*": ["./packages/*"]
}
},
"include": ["./.storybook/main.tsx", "./packages/**/*"],
"exclude": [
"./node_modules",
"./.storybook",
"**/node_modules",
"**/.next",
"**/.lib",
"**/out",
"**/.ts",
"**/*.test.ts",
"**/*.test.js"
]
}
/package/tsconfig.json
...
"workspaces": {
"packages": [
"packages/*"
]
},
"scripts": {
...
"dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"scripts": {
...
"dev": "set NODE_ENV=development&& set NEW_RELIC_ENABLED=false&& nodemon -e js,ts,json --exec babel-node --config-file ../../babel.config.json --extensions .ts,.js ./src/index.ts",
}
{
"babelrcRoots": ["./packages/*"],
"presets": [
"@babel/preset-env",
"@babel/preset-typescript",
[
"minify",
{
"builtIns": false,
"evaluate": false,
"mangle": false
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"regenerator": true,
"corejs": 3
}
]
],
"ignore": ["**/*.test.ts", "**/*.test.tsx", "**/*.test.js", "**/*.test.jsx"]
}
{
"compilerOptions": {
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"noImplicitAny": false,
"allowSyntheticDefaultImports": true,
"noEmit": true,
"isolatedModules": true,
"declaration": true,
"downlevelIteration": true,
"rootDir": ".",
"baseUrl": ".",
"outDir": "./.ts",
"target": "ES5",
"module": "ESNext",
"moduleResolution": "node",
"paths": {
"@allido/*": ["./packages/*"]
}
},
"include": ["./.storybook/main.tsx", "./packages/**/*"],
"exclude": [
"./node_modules",
"./.storybook",
"**/node_modules",
"**/.next",
"**/.lib",
"**/out",
"**/.ts",
"**/*.test.ts",
"**/*.test.js"
]
}
共享组件中没有任何突出的相关内容。这个故事中另一个奇怪的部分是,在同一个工作区中,我有一个nextjs web应用程序,它共享相同的共享组件
包。它还共享相同的babel.config.json和相同的tsconfig文件,并且在docker中运行良好
我想我已经包括了所有相关的文件,但是如果我遗漏了任何重要的内容,请告诉我。我真的很困惑于这样一个事实:在本地使用相同的参数时,这种方法可以很好地工作,但在使用共享卷的最简单的DockerFile中却失败了
我真的非常感谢任何关于如何解决这个问题的帮助或指导。我在网上几乎找不到任何相关信息
谢谢 因此,问题在于在linux容器中运行应用程序,并将windows编译的node_模块附加到其中。因此,为了使其正常工作,我必须使用entrypoint脚本从容器内部安装依赖项,并调整卷配置以省略本地计算机中的node_模块,但仍然允许在src文件更改时进行热重新加载
/project/docker compose.yml
version: '3.8'
services:
api:
container_name: api
environment:
- NODE_ENV=development
volumes:
- './:/project'
build:
context: '.'
dockerfile: Dockerfile.dev
working_dir: /project/packages/api
entrypoint: ['yarn', 'run', 'dev']
ports:
- '3000:3000'
version: '3.8'
services:
api:
container_name: capi
environment:
- NODE_ENV=development
volumes:
- './packages/:/project/packages'
- /project/packages/api/node_modules/
build:
context: '.'
dockerfile: Dockerfile.dev
working_dir: /project/packages/api
entrypoint: ['../../entrypoint.dev.sh']
ports:
- '3000:3000'
/project/entrypoint.dev.sh
#! /bin/bash
echo "install dependencies..."
yarn --cwd /project install
echo "starting node..."
yarn run dev
/project/Dockerfile.dev
# configure container
FROM node:14
USER root
# configure container
FROM node:14
USER root
RUN mkdir /project
RUN chmod -R 777 /project
RUN chown -R node: /project
COPY ./*.json /project/
COPY ./.infrastructure/entrypoint.dev.sh /project/entrypoint.dev.sh
看来core.js 3现在还没有解决这个问题。。答