当 NODE_ENV=production 时,Typescript 编译失败(在 Docker 中)
Typescript compilation fails (in Docker) when NODE_ENV=production
所以我有一个 create-react-app-ts
应用程序,我想 Docker 将其托管在 Zeit Now 上。
本地一切正常,运行 yarn tsc
和 react-scripts-ts build
非常好。
从以下 Docker 文件创建 Docker 图像也很有效:
FROM mhart/alpine-node:10.9
WORKDIR /usr/src
ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV
COPY yarn.lock package.json ./
RUN yarn
COPY . .
RUN yarn build && mv build /public
但是,当发布到 Now 时,构建脚本在 Typescript 编译时失败,为项目中的大多数文件输出编译错误。
如果我在 WORKDIR...
上方的 Docker 文件中设置 ENV NODE_ENV production
,我也可以在本地复制它。
所以当 NODE_ENV=production
时,Typescript 或 react-scripts-ts
的行为似乎有所不同。以前没遇到过这个错误,不知道怎么调试。 运行 NODE_ENV=production tsc
或 NODE_ENV=production react-scripts-ts build
在本地也能正常工作。
我是 运行 Typescript v 3.0.1,配置如下:
{
"compilerOptions": {
"baseUrl": ".",
"outDir": "build/dist",
"module": "esnext",
"target": "es6",
"lib": ["es6", "dom", "esnext.asynciterable"],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"allowSyntheticDefaultImports": true,
"strict": true
},
"exclude": ["node_modules", "build", "scripts", "acceptance-tests", "webpack", "jest", "src/setupTests.ts"]
}
如有任何建议,我们将不胜感激! :)
编辑:将环境变量参数添加到 Docker 文件。为了简洁起见,它最初被遗漏了,但它最终成为问题和解决方案的一部分
所以我终于找到问题了!在我原来的Dockerfile
中,NODE_ENV
设置在之前yarn install
。这意味着对于生产版本,yarn
不会安装 devDependencies
,因此不会安装我的任何 @types
库。这导致了整个项目的所有编译错误。
移动 NODE_ENV
below/after yarn install
在 Dockerfile
中的定义解决了这个问题。
FROM mhart/alpine-node:10.9
WORKDIR /usr/src
COPY yarn.lock package.json ./
RUN yarn
ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV
COPY . .
RUN yarn build && mv build /public
注意:据我所知,yarn build
将确保再次删除 devDependencies
,所以不要担心这会使您的构建膨胀。 :)
所以我有一个 create-react-app-ts
应用程序,我想 Docker 将其托管在 Zeit Now 上。
本地一切正常,运行 yarn tsc
和 react-scripts-ts build
非常好。
从以下 Docker 文件创建 Docker 图像也很有效:
FROM mhart/alpine-node:10.9
WORKDIR /usr/src
ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV
COPY yarn.lock package.json ./
RUN yarn
COPY . .
RUN yarn build && mv build /public
但是,当发布到 Now 时,构建脚本在 Typescript 编译时失败,为项目中的大多数文件输出编译错误。
如果我在 WORKDIR...
上方的 Docker 文件中设置 ENV NODE_ENV production
,我也可以在本地复制它。
所以当 NODE_ENV=production
时,Typescript 或 react-scripts-ts
的行为似乎有所不同。以前没遇到过这个错误,不知道怎么调试。 运行 NODE_ENV=production tsc
或 NODE_ENV=production react-scripts-ts build
在本地也能正常工作。
我是 运行 Typescript v 3.0.1,配置如下:
{
"compilerOptions": {
"baseUrl": ".",
"outDir": "build/dist",
"module": "esnext",
"target": "es6",
"lib": ["es6", "dom", "esnext.asynciterable"],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"allowSyntheticDefaultImports": true,
"strict": true
},
"exclude": ["node_modules", "build", "scripts", "acceptance-tests", "webpack", "jest", "src/setupTests.ts"]
}
如有任何建议,我们将不胜感激! :)
编辑:将环境变量参数添加到 Docker 文件。为了简洁起见,它最初被遗漏了,但它最终成为问题和解决方案的一部分
所以我终于找到问题了!在我原来的Dockerfile
中,NODE_ENV
设置在之前yarn install
。这意味着对于生产版本,yarn
不会安装 devDependencies
,因此不会安装我的任何 @types
库。这导致了整个项目的所有编译错误。
移动 NODE_ENV
below/after yarn install
在 Dockerfile
中的定义解决了这个问题。
FROM mhart/alpine-node:10.9
WORKDIR /usr/src
COPY yarn.lock package.json ./
RUN yarn
ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV
COPY . .
RUN yarn build && mv build /public
注意:据我所知,yarn build
将确保再次删除 devDependencies
,所以不要担心这会使您的构建膨胀。 :)