create-react-app 创建React应用失败,删除当前目录,

5ssjco0h  于 6个月前  发布在  React
关注(0)|答案(1)|浏览(74)

描述bug

当CRA失败时,它会删除创建的目录。然而,在调用create-react-app .时,该目录是当前目录。我看到这是有意为之的,CRA故意将节点进程移出该目录以便删除它,但shell进程仍然留在该目录中。

为什么这是一个问题?

我的用户基础在使用自定义的npm注册表-当配置错误时可能导致模块/模板等解析失败-而npm在不存在的目录中运行时会卡住。**虽然npm在CRA中的失败不是一个问题,**但在这个例子中,npm只是一个例子。许多工具在尝试从不存在的目录中运行时会崩溃,用户可能会尝试使用这些工具来诊断CRA为什么失败。

复制
# create a temp space for easy cleanup
mkdir tmp-cra
cd tmp-cra

# make an incomplete template that will fail
mkdir cra-template-broken
cd cra-template-broken
echo '{"name": "cra-template-broken"}' > package.json
cd ..

# run CRA against that template
mkdir cra-working-directory
cd cra-working-directory
npx create-react-app@latest . --template file:../cra-template-broken

# assert on the current directory existing
pwd
ls $PWD
# npm will break when running inside of a directory which does not exist.
# When CRA fails due to registry or other npm configuration issues,
# you may not realize you're in a non-existent directory before attempting to troubleshoot the registry issue.
npm config get registry

# clean up
cd ../..
rm -r tmp-cra

示例输出(点击展开)

回到我之前提到的防御性代码,似乎process.chdir(...)是为了change the working directory of the current process, but does not change the directory of the overarching shell process设计的,这意味着CRA成功地导航出了这个目录并向上退出,但shell却被留在了后面。显然,这很难做到(我没有证据支持这一点),所以我的建议是完全避免这个问题,只在进程不在那个目录时删除该目录。
我的建议是检测root === process.cwd()并避免进入该目录(见下文),但是我也看到这段代码在createReactApp.js中,因此它是传说中的不可触碰的东西。

-        if (!remainingFiles.length) {
+        if (!remainingFiles.length && root !== process.cwd()) {

⬆️ 可能需要额外的path.resolve(root)吗?
可以使用以下脚本进一步验证节点交互:

echo "shell pwd before: $PWD"
node -e "
const path = require('path')
console.log('script cwd before', process.cwd())
process.chdir(path.resolve(process.cwd(), '..'))
console.log('script cwd after', process.cwd())
"
echo "shell pwd after: $PWD"

示例输出(点击展开)

你尝试恢复依赖项了吗?

N/A

你在用户指南中搜索了哪些术语?

dir(ectory)
remove
clean
fail
error

环境

Environment Info:

  current version of create-react-app: 3.4.1
  running from /Users/z001gk0/.nvm/versions/node/v12.14.1/lib/node_modules/create-react-app

  System:
    OS: macOS Mojave 10.14.6
    CPU: (8) x64 Intel(R) Core(TM) i7-7820HQ CPU @ 2.90GHz
  Binaries:
    Node: 12.14.1 - ~/.nvm/versions/node/v12.14.1/bin/node
    Yarn: 1.22.4 - ~/.nvm/versions/node/v12.14.1/bin/yarn
    npm: 6.13.7 - ~/.nvm/versions/node/v12.14.1/bin/npm
  Browsers:
    Chrome: 83.0.4103.106
    Firefox: Not Found
    Safari: 13.1.1
  npmPackages:
    react: Not Found
    react-dom: Not Found
    react-scripts: Not Found
  npmGlobalPackages:
    create-react-app: 3.4.1

重现步骤

# create a temp space for easy cleanup
mkdir tmp-cra
cd tmp-cra

# make an incomplete template that will fail
mkdir cra-template-broken
cd cra-template-broken
echo '{"name": "cra-template-broken"}' > package.json
cd ..

# run CRA against that template
mkdir cra-working-directory
cd cra-working-directory
npx create-react-app@latest . --template file:../cra-template-broken

# assert on the current directory existing
pwd
ls $PWD
# npm will break when running inside of a directory which does not exist.
# When CRA fails due to registry or other npm configuration issues,
# you may not realize you're in a non-existent directory before attempting to troubleshoot the registry issue.
npm config get registry

# clean up
cd ../..
rm -r tmp-cra

为了重申,npm的问题与此无关,只是作为许多工具之一的例子,当当前目录不存在时,它们会崩溃。

预期行为

要么:

  • 当删除时,CRA应该将shell进程移出工作目录
  • 当它与当前目录相同时,CRA不应该删除工作目录

实际行为

CRA删除了工作目录(当它与当前目录相同时)。

可复现演示

这不是一个运行时问题,而是一个生成问题,所以Steps to reproduce可能就足够了。

uxhixvfz

uxhixvfz1#

这个问题已经修复了吗?我在使用npx create-react-app .时遇到了相同的问题。
平台:Arch linux
节点:16.6.1
npm:7.20.3

相关问题