The Problem -我的npx脚手架脚本在linux上工作得很好,但在windows上不工作.然而,我看到很多软件包在Windows上运行良好,但我无法找出他们做的不同之处.我问AI工具(Chatgpt/Gemini),他们无法提供解决方案.

What happens on linux? - Script is normally executed by node and works fine.
What happens on windows? - It just opens a new command prompt window doing nothing.

  • 我创建了一个npm包@reuk/start来搭建我常用的项目模板.
  • 我打算用它作为npx脚本.类似于npx create-vite.
  • 为此,我创建了一个脚本,并将其添加到package.json"bin": "./bin/cli.js"中的bin字段中.>并公布了这一包.
  • 正常情况下,以node ./bin/cli.js的方式运行该脚本运行得非常好.唯一的问题是,在执行npx @reuk/start操作时,它没有使用 node 调用脚本.
  • 我的cli.js有一个Shebang #!/usr/bin/env node,告诉解释器使用node来运行它.我知道Shebang只能在unix系统上运行,而Windows不支持它,但是create-vite是如何在windows上运行的,为什么我的虽然有类似的代码却不能运行呢?

我到底做错了什么?更重要的是,我如何让它无缝地跨平台工作?

这里是代码供参考— @reuk/start| create-vite

推荐答案

你的bin playbook 的名字似乎和cmd start command冲突.

修复方法可以是为您希望脚本可用的命令 Select 一个更具体的名称.此名称也应该是一个有效的文件名,以避免任何进一步的问题.

在package. json中:

"bin": {
  "rvg": "bin/cli.js"
}

以下是一个简化的、技术上不精确的解释,说明当你运行npx @reuk/start时会发生什么:

  1. Npxtry 使用常见的node.js包解析机制来解析包
  2. 如果没有找到任何东西,它会在全局上安装包
  3. NPM在package.json中看到bin部分,并在node_modules/.bin文件夹下创建特定于平台的包装器.在本例中,它添加了名为start的文件,因为另一个命令-@reuk/start不是有效的文件名.
  4. npxtry 运行start,但它解析为CMD命令,而不是你的脚本.

老实说,最后一点似乎是一个bug,并且有相当多的开放bug与作用域包有关,但我没有找到任何解释这种特殊情况的方法.

Javascript相关问答推荐

如何在JavaScript中在文本内容中添加新行

成帧器运动中的运动组件为何以收件箱开始?

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

为什么我的includes声明需要整个字符串?

格式值未保存在redux持久切片中

React 17与React 18中的不同setState行为

我应该绑定不影响状态的函数吗?'

当运行d3示例代码时,没有显示任何内容

当作为表达式调用时,如何解析方法decorator 的签名?

配置WebAssembly/Emscripten本地生成问题

从Node JS将对象数组中的数据插入Postgres表

使用Promise.All并发解决时,每个promise 的线性时间增加?

单个HTML中的多个HTML文件

连接到游戏的玩家不会在浏览器在线游戏中呈现

如何将数据块添加到d3力有向图中?

如何在Angular拖放组件中同步数组?

JavaScript是否有多个`unfined`?

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

在没有任何悬停或其他触发的情况下连续交换图像

在Java脚本中构建接口的对象