问题 如何用`tsc`和`npm install`解决Chicken / Egg情况?


所以我有标准的文件夹结构

dist/
src/

哪里 src 有我的.ts文件和 dist 有我的.js文件。 (我有 "outDir":"dist" 在我的tsconfig.json文件中,和 "includes" 设置 'src')。

注意 那''dist'在我的身上 gitignore 文件,因此它不在版本控制中,因此当它转到Travis或 CircleCI什么都没有 dist 文件夹,直到我跑 tsc

这里是 问题  - 如果我跑 npm install 首先 - 它会失败因为我在package.json中有这个:

"bin":{
  "foo" :"dist/cli.js"   // dist/cli.js does not exist yet
}

但如果我跑 tsc 首先 - tsc将缺少编译所需的依赖项,如果我运行则会到达 npm install

只要 我能想到解决这个问题的方法,就是安装所有必要的东西 tsc 依赖首先,然后运行tsc,然后运行 npm install --production

然而,这不是最方便的事情。

有没有人遇到这个问题并找到了一个很好的解决方案?


2905
2018-05-31 03:36


起源

我无法重现您在问题中描述的问题。我创建了一个新目录,放了一个 package.json 使用您在问题中显示的规范,添加几个随机依赖项,​​然后运行 npm install 没有任何问题。 - Louis
你可能有 install, 要么 prepare 执行不应该做的事情的脚本。你可以发布你的package.json吗?你可能应该使用 prepublishOnly。只是拥有 bin 不会导致 npm install 失败 - unional


答案:


我不记得有这个问题,但至少在一个案例中我做了一些可以解决这个问题的事情。

我将index.js放在根文件夹中,该文件夹运行dist中的实际依赖项。然后npm寻找的bin是一个存在的文件,它不应该吓坏。

当然,直到tsc运行它才会起作用。但它应该解决你的鸡和鸡蛋问题。


4
2018-05-31 03:49



绝对是一种方法,谢谢 - Alexander Mills
当我尝试这个时发生的问题是,当nodejs脚本不在PATH中时,获取一个shell函数来正确/轻松地定位nodejs脚本。 - Alexander Mills
我想最好的方法是接受这里接受的答案: stackoverflow.com/questions/59895/... - Alexander Mills


看起来像 preinstall 脚本是你需要的

加入你的 package.json 档案为

{
  "scripts": {
    "preinstall" : "tsc ..." // < build stuff
  }
}

参考 https://docs.npmjs.com/misc/scripts


3
2018-05-31 06:10



没错,但是我仍然不会拥有tsc正常运行所需的NPM依赖项 - Alexander Mills
通常预安装脚本会执行很多操作,我认为你应该在bash(或js with shebang)中正确编写它,比如“pre-install.sh”,然后在那个脚本中你可以完成你需要的所有任务,比如安装“npm i tsc”和“tsc ......” - Simone Sanfratello
是的,我可以通过预安装手动安装一些deps - Alexander Mills


我会签入一个文件 ./lib/cli 文件内容是

#!/usr/bin/env node
require('../dist/cli.js')

然后正常运行npm,然后是tsc。


3
2018-06-04 16:46



是的,但如果我有很多文件有点不方便,但我想这是要走的路。 - Alexander Mills


绝对不是你的答案,但我通常只是喜欢提交javascript。

缺点:大量额外的git历史/膨胀。

我的观点:

  • 最后,你正在制作一个javascript项目。因此,应该测试javascript运行时,如果该项目也应该从typescript中使用,请测试生成的 .d.ts;
  • 生成代码的TSC版本不应该是测试和消费者的另一个移动部分。您将测试生成的输出,而不是许多TSC版本的源。
  • 通过包含.js和.d.ts减少“活动部分”边界,你获得的收益(=可预测性)远远超过你失去的(git history膨胀)。

0
2018-06-08 23:41