当前位置: 首页 > 知识库问答 >
问题:

从Github安装时自动构建NPM模块

危彬彬
2023-03-14

假定项目的lib/dir不应该签入Git,因为它包含的文件是派生文件(来自构建过程)。当从项目的github安装包时(例如在开发过程中),lib/dir将不存在,因此如果包的package.jsonmain字段指向(例如)lib/index.js,则导入时无法编译包,因为这些文件不存在于存储库中,因此不存在于安装到node_modules的包中。这意味着需要构建包(就像发布之前一样),只是在本地构建,以便将lib目录(或在构建过程中生成的任何其他文件)添加到模块的目录中。

假设在package.json文件的scripts字段中有一个build脚本,那么在仅从github安装的情况下,是否可以将包配置为自动运行此脚本?如果不是,确保从GitHub安装时构建它的最佳方法是什么?

现在有prepublishprepublishonlyprepare生命周期钩子,但是没有一个可以解决这个问题,因为它们不允许区分安装源。简而言之,是的,它们允许您在install上构建,但它们不允许您仅从github构建install。当人们从npm安装时,不仅没有理由强制构建,而且更重要的是,开发依赖项将不会安装(例如Babel,这对构建至关重要)。

我知道一个处理这个问题的策略:

  • 分叉/分支回购
  • 本地生成
  • .gitignore中删除lib/目录并将其签入。
  • 从分叉/分支安装模块
  • 当您准备好进行PR/rebase时,将lib/dir添加到.gitignore并从git中删除dir。

但这远非理想。我想这可以用githook自动完成。因此,您为掌握项目而进行的每一次推送也会构建并推送到一个单独的分支。

我的用途是我正在开发一个模块,用于许多其他项目。我希望使用该模块的最新版本,而不必在更新代码库时向NPM推出一个版本--我宁愿在准备好时推出更少的版本,但我仍然需要使用GitHub上的任何最新版本的库。

注意:我也联系了NPM对这个问题的支持,如果我收到他们的回应,我会添加他们的回应。


共有1个答案

吴凯泽
2023-03-14

回购中的文件:

 .gitignore
 .npmignore
 ThisIsNpmPackage
 build.js
 package.json

.gitginore:

ThisIsNpmPackage

.npmignore:

!ThisIsNpmPackage
"scripts": {
    "install": "( [ ! -f ./ThisIsNpmPackage ] && [ ! -f ./AlreadyInstalled ] && echo \"\" > ./AlreadyInstalled && npm install . && node ./build.js ) || echo \"SKIP: NON GIT SOURCE\""
}

这个想法是让文件thisisnpmpackage在repo上可用,而不是在npm包中可用。安装钩子它只是一个用来检查thisisnpmpackage是否存在的笨拙脚本。如果是,则执行npm install.(这将确保我们有devdependencies.生成文件alreadyinstalled以防止无限循环(npm install将递归调用install挂钩)

在发布时,我做Git Pushnpm publish
请注意,npm发布可以通过CI工具-githooks实现自动化

这个对文件ThisisNPMPackage进行的小黑客攻击使源检测变得可用。

调用NPM install dumb-package的结果:

“跳过:非Git源码”

并执行NPM安装https://github.com/styczynski/dumb-package

重基和合并就更烦人了。

没有混乱.gitgnore

见鬼,我知道当你有一个麻烦的文件,你必须包括在回购,但从来没有修改他们,或有时删除?太恶心了。

"install": "npm run build"

但这将运行一个安装的每个人从npm下载模块,对吗?这是一个很大的问题,因为任何从NPM下载模块的人都不会安装开发依赖项。用于构建应用程序的库-babel等将不会安装。

注意:但是如果您想要特定版本的包(production/dev)带有或不带有dev依赖项,您可以通过以下途径安装它:

NPM安装--only=dev

npm install <git remote url>
"scripts": {
    "prepare": "npm run build"
}

如果正在安装的包包含prepare脚本,则在打包和安装包之前,将安装其依赖项和devDependencies并运行prepare脚本。

示例:

npm install git+https://isaacs@github.com/npm/npm.git

在下面阅读npm文档:npm安装

    null

这个想法是,您编写一个模块,并为它编写一个安装库:

"scripts": {
    "install": "<do the install>"
}

在这个场景中,您可以放置在以下位置:

npm install . && npm run build

它安装所有的devDependencies(正如前面提到的prepare case所做的那样),但这有点黑客攻击。

 "scripts": {
    "install": "curl -L -J -O \"<some_url>\""
 }

因此,您希望人们制作install package,而不是install package-linuxpackage-window等。

因此,您可以在package.json中提供自定义install脚本

{
  ...
  "scripts": {
     "install": "node ./install_platform_dep.js"
  }
}

然后,在安装模块时,将执行install_platform_dep.js脚本。在install_platform_dep.js中放置:

// For Windows...
if(process.platform === 'win32') {
    // Trigger Windows module installation
    exec('npm install fancy-module-windows', (err, stdout, stderr) => {
         // Some error handling...
    }
} else if ... // Process other OS'es

我想到的是我用了很长时间的解决方案(用CI服务自动构建)。

大多数CI服务的主要目的是在将代码推到分支或对repo执行其他操作时测试/构建/发布代码。

这个想法是,您提供设置文件(如travis.yml或.gitlab-ci.yml),其余的由工具负责。

    null
image: tetraweb/php

cache:
  untracked: true
  paths:
    - public_html/
    - node_modules/

before_script:
  - apt-get update

stages:
  - build
  - test
  - deploy
  
build_product:
  stage: build
  script:
    - npm run test

build_product:
  stage: build
  script:
    - npm run build
  
deploy_product:
  stage: deploy
  script:
    - npm run deploy

当我合并到主分支时,将发生以下事件:

  • 配置项运行生成阶段
  • 如果构建成功,则启动test阶段
  • 如果test阶段正常,则最后触发阶段deploy

脚本是要执行的unix命令列表。

Travis-publish-to-Git

(我自己用的)

然后,当然可以让CI运行:

npm publish .

因为CI执行Unix命令,所以它可以(至少有一堆CI提供程序):

  • 发布标记(可能发布标记?)
  • 触发脚本以更新所有自述文件和所有地方的项目版本
  • 如果所有阶段都成功,则向您发送通知
  • 崔维斯ci
  • 圈ci
  • Gitlab项目的Gitlab CI

这里我附上了我的另一个项目(.travis.yml)的另一个示例:

language: generic
install:
    - npm install
script:
    - chmod u+x ./utest.sh 
    - chmod u+x ./self_test/autodetection_cli/someprogram.sh
    - cd self_test && bash ../utest.sh --ttools stime --tno-spinner

如果您设置CI来推送和发布您的包,您可以始终确保使用最新的尖端版本的代码,而不必担心,嗯,我现在还必须运行这个命令...问题。

 类似资料:
  • 我为我在这个问题上的无知道歉。我没有大量的NPM经验。希望得到一些关于这个问题的反馈。当需要修改包的源代码时,这似乎是一个足够常见的问题?也许有更好的解决办法?

  • 是否也可以专门从拉请求安装? 解决方案仅仅是基于拉请求的最后一次提交(最后一次sha)进行安装吗?

  • 尝试从github安装模块会导致: package.json上的ENOENT错误。 使用Express轻松复制: 引发错误。 可以工作。 为什么我不能从GitHub安装? 以下是控制台输出:

  • 我想在我的项目中使用npm从github安装引导加载程序 目前,他们正在维护该项目的两个版本,可与webpack版本1和2兼容。 我想安装版本1。我应该使用什么npm命令来安装这个? 我尝试使用下面的一个,但它不工作。

  • 问题内容: 尝试安装npm模块时,出现奇怪的权限错误。我从头开始,因此我确定我确实可以访问,但是由于某些原因,它一直在抱怨错误: 堆栈错误:EACCES:权限被拒绝,mkdir’/ usr / lib / node_modules / joplin / node_modules / sqlite3 / build’ 我尝试重新启动计算机,并使用chmod 777 创建目录,但仍然无法正常工作。 编