描述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
可能就足够了。
1条答案
按热度按时间uxhixvfz1#
这个问题已经修复了吗?我在使用
npx create-react-app .
时遇到了相同的问题。平台:Arch linux
节点:16.6.1
npm:7.20.3