我的项目具有这样的monorepo结构:
babel.config.js
a-something
b-something
在项目的根目录中有babel配置文件,还有软件包a-something
和b-something
。
在软件包a-something
中,我具有以下webpack配置:
const path = require('path')
module.exports = {
target: 'node',entry: './src/index.js',output: {
filename: 'bundle.js',path: path.resolve(__dirname,'build')
},devtool: 'source-map',module: {
rules: [
{
test: /\.js?$/,use: {
loader: 'babel-loader',options: {
rootMode: 'upward'
}
},include: [
path.resolve(__dirname,'src'),/node_modules\/a-/,/node_modules\/b-/
]
}
]
}
}
在包a-something
中,我有以下package.json:
{
"name": "a-something","version": "1.0.0","description": "","main": "index.js","scripts": {
"prod:build": "webpack --config webpack.config.js","prod:start": "node build/bundle.js"
},"author": "","license": "ISC","dependencies": {
"express": "^4.16.2","graphql": "^14.5.8","graphql-request": "^1.8.2","graphql-tag": "^2.10.1","b-something": "^1.0.0","node-fetch": "^2.6.0","sitemap": "^5.0.0"
},"devDependencies": {
"webpack": "3.5.6","@babel/polyfill": "7.7.0"
}
}
我的根package.json具有以下依赖关系:
"@babel/cli": "^7.5.5","@babel/core": "^7.5.5","babel-loader": "8.0.6"
最后,我在软件包a-something
中的Dockerfile是:
FROM node:10.15.1
COPY ./package.json /src/package.json
ENV PORT 3000
ENV NODE_ENV production
WORKDIR /src
RUN npm install
COPY ./lerna.json /src/lerna.json
COPY ./packages/a-something/package.json /src/packages/a-something/package.json
COPY ./packages/b-something/package.json /src/packages/b-something/package.json
RUN npm run clean
COPY . /src
WORKDIR /src/packages/a-something
RUN npm run prod:build
RUN echo "FINISHED BUILDING!"
EXPOSE ${PORT}
CMD ["npm","run","prod:start"]
当我运行npm run prod: build
和npm run prod: start
时,捆绑包成功构建,但是当我构建docker(上下文是根文件夹)时,出现以下npm错误:
ERROR in Entry module not found: Error: Can't resolve 'babel-loader' in '/src/packages/a-something'
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! a-something@1.0.0 prod:build: `webpack --config webpack.config.js`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the a-something@1.0.0 prod:build script.
我的主机操作系统是macOS Mojave。也许Lerna生成的符号链接在Debian(由节点image使用)上的处理方式有所不同?
更新:通过将所有与babel相关的npm软件包从root package.json的devDependencies
移至dependencies
部分,解决了该问题。有谁知道为什么这可以解决问题?