Skip to content
This repository has been archived by the owner on Jun 2, 2024. It is now read-only.

私有npm和公共仓库npm 混合 scope 出错 #1306

Closed
ZengTianShengZ opened this issue Mar 13, 2018 · 6 comments
Closed

私有npm和公共仓库npm 混合 scope 出错 #1306

ZengTianShengZ opened this issue Mar 13, 2018 · 6 comments

Comments

@ZengTianShengZ
Copy link

ZengTianShengZ commented Mar 13, 2018

在我的项目里有公共的 npm 也有自己的私有npm @cnpm/demo

{
  "name": "demo",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "author": "zengsisheng@163.com",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "lint": "eslint --ext .js,.vue src",
    "build": "node build/build.js"
  },
  "dependencies": {
    "@cnpm/demo": "^1.0.5",
    "vue": "^2.5.15"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-eslint": "^8.2.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-loader": "^7.1.1",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "css-loader": "^0.28.0",
    "eslint": "^4.15.0",
    "eslint-config-standard": "^10.2.1",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-loader": "^1.7.1",
    "eslint-plugin-html": "^4.0.2",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-node": "^5.2.0",
    "eslint-plugin-prettier": "^2.6.0",
    "eslint-plugin-promise": "^3.4.0",
    "eslint-plugin-standard": "^3.0.1",
    "eslint-plugin-vue": "^4.0.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^2.30.1",
    "less": "^3.0.1",
    "less-loader": "^4.0.6",
    "node-notifier": "^5.1.2",
    "node-sass": "^4.7.2",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^11.0.0",
    "postcss-loader": "^2.0.8",
    "postcss-url": "^7.2.1",
    "rimraf": "^2.6.0",
    "sass-loader": "^6.0.7",
    "scss-loader": "^0.0.1",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^0.5.8",
    "vue-loader": "^13.3.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

我用我自己的源进行包的安装

npm install --registry=http://npm.xxxxxx.com/registry/

接着就报错了

npm ERR! code E404
npm ERR! 404 Not Found: @babel/traverse@^7.0.0-beta.40

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/zengtiansheng/.npm/_logs/2018-03-13T09_03_27_308Z-debug.log
wuhaodeMacBook-Pro:demo zengtiansheng$ npm i --registry=http://npm.xxxxxx.com/registry/
npm ERR! code E404
npm ERR! 404 Not Found: @babel/types@^7.0.0-beta.40

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/zengtiansheng/.npm/_logs/2018-03-13T09_32_42_258Z-debug.log

我的私有库的 config.js 配置

  // sync source, upstream registry
  // If you want to directly sync from official npm's registry
  // please drop them an email first
  sourceNpmRegistry: 'https://registry.npm.taobao.org',

  // registry scopes, if don't set, means do not support scopes
  scopes: [ '@cnpm', '@cnpmtest', '@cnpm-test' , '@demo'],

也就是在 install 的时候遇到含有 scope 的包就会去私有npm下载包 如:@cnpm/demo ,公共的 npm 会去 sourceNpmRegistry: 'https://registry.npm.taobao.org', 下载包 。
但公共的npm包也有包含 scope 的 如 :@babel/traverse@^7.0.0-beta.40 , 报错的原因是 @babel 这个 scope 下的包跑去私有 npm 下载包了,我的私有 npm 当然没有这个公共的 npm 包,所以就报错了。
但我的 config.js 配置并没有配置 @babel 这个 scope,怎么就把 @babel/traverse@^7.0.0-beta.40 指到我的私有npm下载包呢,这就很蛋疼了,哪位遇到类似情况还望解答

npm -v
5.6.0

node -v
v9.2.1
@ZengTianShengZ ZengTianShengZ changed the title 如何混合使用npm的公共仓库和cnpm搭建的私有仓库 私有npm和公共仓库npm 混合 scope 出错 Mar 13, 2018
@dunhuang
Copy link

dunhuang commented Oct 19, 2018

这个库没人维护了吗?。。。。

我也碰到类似问题,只能自己想办法了。

最后我是通过nginx做反向代理解决的,原理是,包含自己公司scope的/@abc的请求转到私有url上,带其他@开头的请求转到淘宝源上去。

假设我们公司的私有库源名为@abc,cnpm仓库url为registry.cnpmjs.abc.com,注意这句:proxy_set_header Host registry.npm.taobao.org; 必须写,否则淘宝返回404

       server {
           listen 80;
           server_name registry.cnpmjs.abc.com;
           location / {
             add_header Access-Control-Allow-Origin *;
             proxy_pass http://127.0.0.1:7001;
             proxy_redirect off;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           }
           location ^~ /@abc {
             add_header Access-Control-Allow-Origin *;
             proxy_pass http://127.0.0.1:7001;
             proxy_redirect off;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           }
          location ~* ^\/@(?!abc).*$ {
            add_header Access-Control-Allow-Origin *;
            proxy_pass https://registry.npm.taobao.org;
            proxy_redirect off;
            proxy_set_header Host registry.npm.taobao.org;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }
       }

@ShangguanQuail
Copy link

在我的项目里有公共的 npm 也有自己的私有npm @cnpm/demo

{
  "name": "demo",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "author": "zengsisheng@163.com",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "lint": "eslint --ext .js,.vue src",
    "build": "node build/build.js"
  },
  "dependencies": {
    "@cnpm/demo": "^1.0.5",
    "vue": "^2.5.15"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-eslint": "^8.2.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-loader": "^7.1.1",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "css-loader": "^0.28.0",
    "eslint": "^4.15.0",
    "eslint-config-standard": "^10.2.1",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-loader": "^1.7.1",
    "eslint-plugin-html": "^4.0.2",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-node": "^5.2.0",
    "eslint-plugin-prettier": "^2.6.0",
    "eslint-plugin-promise": "^3.4.0",
    "eslint-plugin-standard": "^3.0.1",
    "eslint-plugin-vue": "^4.0.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^2.30.1",
    "less": "^3.0.1",
    "less-loader": "^4.0.6",
    "node-notifier": "^5.1.2",
    "node-sass": "^4.7.2",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^11.0.0",
    "postcss-loader": "^2.0.8",
    "postcss-url": "^7.2.1",
    "rimraf": "^2.6.0",
    "sass-loader": "^6.0.7",
    "scss-loader": "^0.0.1",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^0.5.8",
    "vue-loader": "^13.3.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

我用我自己的源进行包的安装

npm install --registry=http://npm.xxxxxx.com/registry/

接着就报错了

npm ERR! code E404
npm ERR! 404 Not Found: @babel/traverse@^7.0.0-beta.40

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/zengtiansheng/.npm/_logs/2018-03-13T09_03_27_308Z-debug.log
wuhaodeMacBook-Pro:demo zengtiansheng$ npm i --registry=http://npm.xxxxxx.com/registry/
npm ERR! code E404
npm ERR! 404 Not Found: @babel/types@^7.0.0-beta.40

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/zengtiansheng/.npm/_logs/2018-03-13T09_32_42_258Z-debug.log

我的私有库的 config.js 配置

  // sync source, upstream registry
  // If you want to directly sync from official npm's registry
  // please drop them an email first
  sourceNpmRegistry: 'https://registry.npm.taobao.org',

  // registry scopes, if don't set, means do not support scopes
  scopes: [ '@cnpm', '@cnpmtest', '@cnpm-test' , '@demo'],

也就是在 install 的时候遇到含有 scope 的包就会去私有npm下载包 如:@cnpm/demo ,公共的 npm 会去 sourceNpmRegistry: 'https://registry.npm.taobao.org', 下载包 。
但公共的npm包也有包含 scope 的 如 :@babel/traverse@^7.0.0-beta.40 , 报错的原因是 @babel 这个 scope 下的包跑去私有 npm 下载包了,我的私有 npm 当然没有这个公共的 npm 包,所以就报错了。
但我的 config.js 配置并没有配置 @babel 这个 scope,怎么就把 @babel/traverse@^7.0.0-beta.40 指到我的私有npm下载包呢,这就很蛋疼了,哪位遇到类似情况还望解答

npm -v
5.6.0

node -v
v9.2.1

仔细看了你这个问题,你下载的包有对 @babel/traverse@^7.0.0-beta.40 的依赖,但是由于后台还在sync所有的依赖包,其中 @babel/traverse@^7.0.0-beta.40 还没有sync过来,所以报错了,你可以等几分钟再安装或者去web页面手动sync这个包

@ShangguanQuail
Copy link

这个库没人维护了吗?。。。。

我也碰到类似问题,只能自己想办法了。

最后我是通过nginx做反向代理解决的,原理是,包含自己公司scope的/@abc的请求转到私有url上,带其他@开头的请求转到淘宝源上去。

假设我们公司的私有库源名为@abc,cnpm仓库url为registry.cnpmjs.abc.com,注意这句:proxy_set_header Host registry.npm.taobao.org; 必须写,否则淘宝返回404

       server {
           listen 80;
           server_name registry.cnpmjs.abc.com;
           location / {
             add_header Access-Control-Allow-Origin *;
             proxy_pass http://127.0.0.1:7001;
             proxy_redirect off;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           }
           location ^~ /@abc {
             add_header Access-Control-Allow-Origin *;
             proxy_pass http://127.0.0.1:7001;
             proxy_redirect off;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           }
          location ~* ^\/@(?!abc).*$ {
            add_header Access-Control-Allow-Origin *;
            proxy_pass https://registry.npm.taobao.org;
            proxy_redirect off;
            proxy_set_header Host registry.npm.taobao.org;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }
       }

你的问题和一楼不一样,建议看看 config/index.js 里面的 scopes 字段的定义,应该可以解决你的问题

@dunhuang
Copy link

为啥我觉得一样:
我是在config/config.js里的scopes 定义了['@abc'] ,这个配置的优先级比config/index.js里的scopes更高,应该是生效的。
现象就是 @babel/xxxx如果在package.json的一级依赖,可以指向公有库进行安装,成功。
如果@babel/xxxx是在二级依赖就安装不成功。
我暂且按我的方式解决了
@ShangguanQuail

@ShangguanQuail
Copy link

为啥我觉得一样:
我是在config/config.js里的scopes 定义了['@abc'] ,这个配置的优先级比config/index.js里的scopes更高,应该是生效的。
现象就是 @babel/xxxx如果在package.json的一级依赖,可以指向公有库进行安装,成功。
如果@babel/xxxx是在二级依赖就安装不成功。
我暂且按我的方式解决了
@ShangguanQuail

你是从哪个版本拉的分支?还是说你自己改过,现在的master分支上config下面没有config.js文件啊

@dunhuang
Copy link

去年10月份,同时有config.js和index.js

@fengmk2 fengmk2 closed this as completed Mar 27, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants