当NODE_ENV = production时,打字稿编译失败(在Docker中)

jhm*_*jhm 3 environment-variables typescript docker create-react-app vercel

因此,我有一个create-react-app-ts要Dockerize并托管在Zeit Now上的应用程序。

一切工作正常本地,运行yarn tscreact-scripts-ts build伟大工程。

从以下Dockerfile创建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
Run Code Online (Sandbox Code Playgroud)

但是,发布到Now时,生成脚本在Typescript编译时失败,从而为项目中的大多数文件输出编译错误。

如果我ENV NODE_ENV production在上面的Dockerfile中进行设置,我也可以在本地复制该文件WORKDIR...

因此,似乎TypeScript或react-scripts-ts行为不同NODE_ENV=production。我以前从未遇到过此错误,而且我也不知道如何调试它。在本地运行NODE_ENV=production tscNODE_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"]
}
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激!:)

编辑:将env var args添加到Dockerfile。为了简洁起见,最初将其省略,但最终成为问题和解决方案的一部分

jhm*_*jhm 6

所以我终于找到了问题!在我的原著中DockerfileNODE_ENV被设定为之前 yarn install。这意味着对于生产版本,yarn将不会安装devDependencies,因此不会安装我的任何@types库。这导致了整个项目的所有编译错误。

在解决问题中移动了“在... NODE_ENV 以下/之后” 的定义。yarn installDockerfile

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
Run Code Online (Sandbox Code Playgroud)

注意:据我所知,请yarn build确保devDependencies再次删除,所以不必担心会膨胀您的构建。:)

  • 这让我头疼了好几个小时。谢谢! (2认同)