如何在git中“发布”私有Typescript npm包?

时间:2019-03-05 12:26:53

标签: git typescript npm publishing

我认为这应该是一个标准问题,但是我找不到任何答案...

我有两个打字稿项目-LibraryA和WebserverB。它们是独立的项目,每个项目都有自己的git信息库。它们也是私人项目-我不希望它们在公共场合公开。

很显然,我想在WebserverB中使用LibraryA。我认为正确的方法是通过npm,因为它管理所有其他库。幸运的是,npm在依赖项中支持git URL,因此我可以将其直接指向LibraryA的存储库。

但是,该存储库不包含已编译的Javascript文件,仅包含TypeScript文件。我该如何进行这项工作?还是在这种情况下正确的方法是什么?

3 个答案:

答案 0 :(得分:1)

如果您不想从git存储库中的源安装依赖项,请使用以下其他解决方案:

解决方案#1-从本地文件夹安装依赖项

一种简便的解决方案是通过LibraryA安装git clone并进行构建。然后,在WebserverB/中,您可以执行npm install ../path/to/local/LibraryA

  
      
  • npm install <文件夹>:
  •   
     

在当前项目中将软件包作为符号链接安装在目录中。它的依赖项将在链接之前安装。如果 位于项目的根目录中,则其依赖项可能会像其他类型的依赖项一样被提升到顶级 node_modules 。 (Source: NPM documentation

解决方案#2-安装私有npm代理注册表

您可以在服务器上安装私有npm代理注册表,例如Verdaccio。然后,您将能够发布包含所有编译文件的软件包。

解决方案3-支付NPM并发布私有软件包

您可以在付费帐户的private repository中发布真实的程序包(也包含编译的文件)。

解决方案#4 —作为发行版发布在GitHub存储库中(未测试)

NPM documentation表示另一种选择:

  
      
  • npm安装
  •   
     

获取tarball网址,然后安装它。为了区分此选项和其他选项,参数必须以“ http://”或“ https://”开头

然后,发布一个软件包,以new release的形式在您的私有Github存储库中进行构建,压缩和上传。之后,应该可以使用个人访问令牌通过URL访问tarball吗?

答案 1 :(得分:0)

我想您可以在编译该库的install中添加一个package.json脚本。然后,您只需将maintypes指向输出文件。

答案 2 :(得分:0)

好的,我将用其他答案的摘要和一些其他选项来回答我自己的问题。

经过一番思考,我意识到了。问题是-谁和何时运行tsc将LibraryA的Typescript编译为Javascript?基本上只有几种选择:

  1. LibraryA的开发人员运行它并在某个位置发布编译结果;
  2. LibraryA以源代码形式发布,并且在将软件包安装到WebserverB时会进行编译;
  3. LibraryA以源代码形式发布,并且构建WebserverB也会编译该库。

让我们详细看一下。

1。发布编译结果

然后的问题是-发布结果存储在哪里?它必须位于NPM可以访问的位置。因此,只有少数选择:

  • npm注册表(如果可以,可以私有,如果可以的话可以公开)。缺点:嗯,你必须为此付出代价。
  • 某个服务器上的压缩包,您可以在其中获得URL。缺点:您必须拥有一台服务器来托管这些服务器。并照顾好所述服务器。
  • 新的GIT存储库。不打包,因为npm无法从git仓库解压缩。缺点:您现在有一个项目的两个存储库。
  • LibraryA所在的git仓库。本质上,您不仅要提交TypeScript源文件,还要提交编译结果。缺点:提交编译工件是完全错误的。然后,您将发布源以及已编译的结果。您不需要WebserverB中的那些。
  • LibraryA所在的同一个git存储库,但位于单独的断开连接的分支中。缺点:这令人困惑。您看到两个断开的主分支有多少个存储库?

尽管有缺点,但它们都是可维修的选择。

2。安装时编译

这里的主要缺点是,这立即使WebserverB上的打字稿依赖。不仅是开发依赖性,还包括完整的运行时依赖性。可能还可以,但是真的很奇怪。您如何计划部署WebserverB?那也可以运行编译吗?我不认为这是要走的路。但这是可能的。有关详细信息,请参见H.B.'s answer

3。与WebserverB一起编译

好吧,如果您只计划在打字稿项目中使用它,那可能没问题。我不确定是否要安装它。您需要修改tsconfig.json文件,使其在编译中包含node_modules/LibraryA。那真是怪了。您的IDE对此会感到高兴吗?总而言之,这也不是一个好主意。感觉就像在打架/滥用系统一样,而且收效甚微。

最后,我想我将采用“提交已编译的JS”方法。因为“ 完全错误”不是一个好参数。而且由于这是一个私人项目,因此额外发布的资源也不是什么大问题。实际上,也许他们甚至会帮助调试。