如何让npm从GitHub URL安装打字稿依赖项?

时间:2018-06-28 09:12:35

标签: typescript github npm npm-install

请考虑以下情形:

  • 有一个代码库。该库用TypeScript编写,而打字稿代码在GitHub上发布。 package.json文件具有一个构建脚本和一个发布脚本,该构建脚本根据TypeScript代码创建JavaScript文件,然后将发布的JS文件放置在npm上。
  • 我创建了GitHub存储库的分支,对打字稿文件进行了一些修改,并将这些更改推送到GitHub。 (我还为原始的GitHub存储库打开了PR,但是在合并这些更改之前需要花费一些时间。)
  • 我希望在下游NPM软件包中使用这些代码更改,因此在下游软件包中,我将对修改后的软件包的引用(在下游的package.json文件中)更改为fork的GitHub URL,然后执行{ {1}}。

这不起作用,因为:

  • 修改后的软件包的package.json文件未在npm install字段中列出打字稿文件,仅列出了自动生成的JS文件,因此在npm安装期间不会提取TypeScript文件。
  • 由于未检入GitHub,因此不存在已编译的JS文件。

我该如何解决?有没有一种方法可以修改dist的行为,以便它可以提取回购中npm install中没有的文件,然后在安装过程中运行构建脚本?

3 个答案:

答案 0 :(得分:1)

prepack脚本的docs建议在从git repo安装依赖项后运行该脚本。尝试在git依赖项的package.json中放入以下内容:

{
  "scripts": {
    "prepack": "call the build script"
  }
}

这应该在您npm install之后构建软件包,这听起来像您想要做的。我不确定除此之外是否还有其他问题。

答案 1 :(得分:0)

我有同样的问题。看到了很多有关monorepos的文章(下面的链接),但是关于如何将TypeScript项目拆分为单独的存储库的文章却很少。

简而言之,您需要一步建立JS文件。

有关有效的代码示例,请参见https://github.com/stared/yarn-adding-pure-typescript-package-example

因此,有一些解决方案。假设存储库为someuser/package-to-import

安装后

使用yarn,您可以直接从GitHub存储库获取项目:

yarn add someuser/package-to-import#master

(或与npm install someuser/package-to-import#master相同)

如果您使用此存储库的分支,则可以通过在package.json中添加到package-to-import回购此部分来简化工作:

  "scripts": {
    ...,
    "postinstall": "tsc --outDir ./build"
  }

现在,它可以与yarn add/upgrade一起使用,而无需使用额外的脚本。 另外,您也可以半手动完成操作,即在主存储库package.json

中创建一个脚本
  "scripts": {
    ...,
    "upgrade-package-to-import": "yarn upgrade package-to-import && cd node_modules/package-to-import && yarn build"
  }

链接

有另一种方法可以将存储库克隆到另一个文件夹中,构建文件并将其链接。

git clone git@github.com:someuser/package-to-import.git
cd package-to-import
npm run build  # or any other instruction to build
npm link

如果使用毛线,最后两行将是:

yarn build
yarn link

然后,输入项目的文件夹并编写

npm link package-to-import

或在纱线情况下

yarn link package-to-import

这些是符号链接,因此当您从存储库中提取并构建文件时,将使用更新的版本。

另请参阅:

Monorepos

一种完全不同的方法。 对于使用git子模块的混合建议:

答案 2 :(得分:0)

在您的fork中构建文件,并将其提交到fork的repo / branch。

我遇到了与您完全相同的问题。真的,令我惊讶的是,我能够用Google搜索您的StackOverflow问题,因为这很难描述。

简而言之,为了支持Gradle Plugin 6.0.0,我不得不派生react-native-webview库来更新kotlinVersion

如您所见here,我对它进行了很好的修改,并对该版本进行了改进。

然后我将这个特定的fork和branch添加到我的package.json文件中:

"react-native-webview": "github:cntral/react-native-webview#5_8_2"

此后我会做npm install,会得到error Command "tsc" not found.

经过大量挖掘之后,该库的"prepack": "yarn build"中有一个package.json脚本,只要将其作为git依赖项包含在内,它将尝试运行。但是我们没有使用TypeScript,因此它尝试运行yarn build,而yarn tsc却无法运行tsc

好的,所以我尝试将typescript作为devDependency添加到我的package.json中,看看是否可以解决。没有。我尝试使用yarn install而不是npm install来查看是否可以解决该问题。它将安装得很好,但是如果您查看node_modules/react-native-webview目录,则应该存在于lib/中的转换后的JavaScript文件不存在。所以那行不通。

然后我想,如果所有这些都想将TypeScript文件转换为普通的JavaScript,以便我们的应用可以使用它,为什么不在我们的fork中这样做并提交那些.js文件。所以我做了。

我在yarn build的分支中运行react-native-webview,从lib/中删除了.gitignore目录,然后提交了这些更改,如您所见here

然后,我还必须从分叉的"prepack": "yarn build"中删除package.json,以便它不会尝试构建库并再次运行tsc,这是{{3 }}。

此后,我们的应用程序就可以正常使用它,就像我们从npm或GitHub上使用的任何其他库一样。

希望对别人有帮助。