在window上测试安装cnpmjs.org私有仓库
发布于 2 年前 作者 twolun 2313 次浏览 来自 分享

在window上测试安装cnpm私有仓库

官方说明只能在linux和mac安装

1. clone到本地,安装dependencies

  # from git
  $ git clone https://github.com/cnpm/cnpmjs.org.git
  # 因为是在window上安装,所有官方文档上的一些命令就不能使用了,
  $ cd cnpmjs.org
  $ npm install
  $ npm run dev

上面的最后一条命令执行肯定是会报错的,下面我们就按着报错提示,一个一个的解决
最终搭建自己完美的私有npm仓库

2. npm run dev报错

  D:\www\cnpmjs.org [master ≡ +0 ~1 -0 !]
  λ npm run dev

  > [email protected] dev D:\www\cnpmjs.org
  > DEBUG=cnpm* node dispatch.js

  'DEBUG' 不是内部或外部命令,也不是可运行的程序
  或批处理文件。

  npm ERR! Windows_NT 10.0.14393
  npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "dev" npm ERR! node v6.10.0
  npm ERR! npm  v3.10.10
  npm ERR! code ELIFECYCLE
  npm ERR! [email protected] dev: `DEBUG=cnpm* node dispatch.js`
  npm ERR! Exit status 1

此命令错误主要是window不能执行DEBUG=cnpm*命令,所以我们要改这条命令 更新package.json中命令如下,主要看dev命令

{
  "scripts": {
    "dev": "set DEBUG=cnpm* & node dispatch.js",
    "test": "make jshint && make test",
    "test-local": "make test",
    "start": "./bin/nodejsctl start && cp History.md docs/web/history.md",
    "status": "./bin/nodejsctl status",
    "stop": "./bin/nodejsctl stop"
  }
}

再次执行npm run dev命令,已经不错了

  D:\www\cnpmjs.org [master ≡ +0 ~2 -0 !]
  λ npm run dev

  > [email protected] dev D:\www\cnpmjs.org
  > set DEBUG=cnpm* & node dispatch.js

  Starting cnpmjs.org ...
  cluster: false
  admins: {"fengmk2":"[email protected]","admin":"[email protected]","dead_horse":"[email protected]"}
  scopes: ["@cnpm","@cnpmtest","@cnpm-test"]
  sourceNpmRegistry: https://registry.npm.taobao.org
  syncModel: none
  [Wed Jan 24 2018 14:52:05 GMT+0800 (中国标准时间)] [worker:34728] Server started, registry server listen at 127.0.0.1:7001, web
  listen at 127.0.0.1:7002, cluster: false

3. 我们根据提示访问127.0.0.1:7002,不用说又要报错了,但是页面应该是能访问的了

  cnpmjs.org:middleware:auth GET / with "" +0ms
  cnpmjs.org:middleware:auth GET /total with "" +416ms
{ SequelizeDatabaseError: SQLITE_ERROR: no such table: module
    at Query.formatError (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:348:14)
    at afterExecute (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:112:29)
    at replacement (D:\www\cnpmjs.org\node_modules\sqlite3\lib\trace.js:19:31)
    at Statement.errBack (D:\www\cnpmjs.org\node_modules\sqlite3\lib\sqlite3.js:16:21)
  name: 'SequelizeDatabaseError',
  message: 'SQLITE_ERROR: no such table: module',
  parent:
   { Error: SQLITE_ERROR: no such table: module
       at Error (native)
     errno: 1,
     code: 'SQLITE_ERROR',
     sql: 'SELECT count(name) AS count FROM module;' },
  original:
   { Error: SQLITE_ERROR: no such table: module
       at Error (native)
     errno: 1,
     code: 'SQLITE_ERROR',
     sql: 'SELECT count(name) AS count FROM module;' },
  sql: 'SELECT count(name) AS count FROM module;',
  url: '/total' }
SequelizeDatabaseError: SQLITE_ERROR: no such table: module
    at Query.formatError (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:348:14)
    at afterExecute (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:112:29)
    at replacement (D:\www\cnpmjs.org\node_modules\sqlite3\lib\trace.js:19:31)
    at Statement.errBack (D:\www\cnpmjs.org\node_modules\sqlite3\lib\sqlite3.js:16:21)

这些错误的意思简单说就是没有database,没有table,什么都没有,怎么办
// - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
这是cnpmjs支持的数据库列表,默认使用sqlite,我准备使用mysql,所以安装mysql请百度

4. 因为我们是在window上跑这个项目,所以一些自动化命令我们就不能使用了

我们要手动执行sql语句,创建数据表,sql语句在./docs/db.sql
为方便,使用navicat客户端工具(自己安装)

4.1 连接mysql

mysql_connect.png

4.2 创建数据库cnpmjs(名字随便)

在mysql连接名字上比如local,右键->新建数据库

database.png

4.3 执行sql

在数据库cnpmjs名字上右键->命令行界面,将./docs/db.sql中的sql语句进行copy,
粘贴到命令,回车执行ok。
特别注意有个./docs/user.sql,必须单独执行一下

sql.png

4.4 修改配置文件config/index.js

主要配置db, username, password, dialect, host, port

  /**
   * database config
   */

  database: {
    db: 'cnpmjs',
    username: 'root',
    password: 'root',

    // the sql dialect of the database
    // - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
    dialect: 'mysql',

    // custom host; default: 127.0.0.1
    host: '127.0.0.1',

    // custom port; default: 3306
    port: 3306,

    // use pooling in order to reduce db connection overload and to increase speed
    // currently only for mysql and postgresql (since v1.5.0)
    pool: {
      maxConnections: 10,
      minConnections: 0,
      maxIdleTime: 30000
    },

    // the storage engine for 'sqlite'
    // default store into ~/.cnpmjs.org/data.sqlite
    storage: path.join(dataDir, 'data.sqlite'),

    logging: !!process.env.SQL_DEBUG,
  },

5. 重新启动项目npm run dev,现在应该一切正常了

index.png

7001验证

7001.png

6. 现在到了我们怎么使用私有库的时候了

6.1 我们使用nrm这个模块进行npm库的管理

  #
  $ npm install nrm -g

  $ nrm ls

  # npm ---- https://registry.npmjs.org/
  # cnpm --- http://r.cnpmjs.org/
  # * taobao - https://registry.npm.taobao.org/
  # nj ----- https://registry.nodejitsu.com/
  # rednpm - http://registry.mirror.cqupt.edu.cn/
  # npmMirror  https://skimdb.npmjs.com/registry/
  # edunpm - http://registry.enpmjs.org/

上面可以看出可以用的npm仓库地址,*标明当前使用的仓库地址,使用npm use 'name'切换仓库

6.2 添加本地私有仓库

cnpm提供两个端口:7001和7002,其中7001用于NPM的注册服务,7002用于Web访问

  $ nrm add local http://127.0.0.1:7001/

    add registry local success

  $ nrm ls

  # npm ---- https://registry.npmjs.org/
  # cnpm --- http://r.cnpmjs.org/
  # * taobao - https://registry.npm.taobao.org/
  # nj ----- https://registry.nodejitsu.com/
  # rednpm - http://registry.mirror.cqupt.edu.cn/
  # npmMirror  https://skimdb.npmjs.com/registry/
  # edunpm - http://registry.enpmjs.org/
  # local -- http://127.0.0.1:7001/

local就是我们刚才添加的本地私有npm仓库,执行

  nrm use local
  # 使用本地仓库

6.3 发布npm包

在发布 npm 包之前,需要先将原先的 config/config.js 中添加一些配置属性:

  enablePrivate: true, // 只有管理员可以发布 npm 包,默认为 false,即任何人都可以发布包
  admins: {
    admin: '[email protected]' // 管理员权限
  },
  scopes: ['@company'], // 私有包必须依附于 scope 下

登录我们配置的管理员

  # 使用本地仓库
  nrm use local
   Registry has been set to: http://127.0.0.1:7001/
  # 执行登录
  npm login
  Username: admin     # 输入用户名
  Password:           # 密码admin
  Email: (this IS public) [email protected]     # 邮箱就是配置的邮箱
    Logged in as admin on http://127.0.0.1:7001/.

我们知道,要发布包到npm,需要有github仓库地址,现在我们就在github上建个demo作测试
实际使用应该使用公司内部的gitlab

我们直接使用已有的demo

  git clone [email protected]:twolun/xxx-utils.git
  cd xxx-utils
  npm publish
    + @evcard/[email protected]
    # 应该是发布成功

1.下面我们在仓库中查看,已经有了一个包了

ready.png

2.这上面只有通过搜索才能查看到发布的包

search.png

3.进一步查看,注意我画红线的部分,是在config/index.js里配置的

detail.png

4.最后一点要注意,就是我们发布包的package.json文件里有包名的写法
尤其注意name的写法@company也是固定的,与config/index.js里的配置相对应

{
  "name": "@company/xxx-utils",
  "version": "1.0.3",
  "description": "私有包测试demo",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "[email protected]",
  "license": "ISC"
}

6.4 安装本地仓库刚刚发布的xxx-utils

  D:\github\fis3-parser-html-plugin1
  npm install @company/xxx-utils -S
  [email protected] D:\github\fis3-parser-html-plugin1
    `-- @company/[email protected]

  npm WARN [email protected] No repository field.

到此安装成功,应该可以使用了

总结

  1. 全程window环境,相信在mac, linux环境肯定也没问题的
  2. sql语句手动执行,创建database和table
  3. 更改相关配置一切搞定
  4. 全程没有使用cnpm这个,使用更方便nrm来切换仓库池
  5. 更多详细配置请查看cnpmjs.org官方文档

详细文档地址 完整demo地址
xxx-utils地址

2 回复

虽然是用linux但是还是要点个赞

@SHocker-Yu window上也能跑起来的,

回到顶部