phpstorm 新建拉取项目_自动化统计项目依赖包信息

背景:前端组支持了众多的项目,如何快速统计各个项目使用的依赖包?

这个问题常规方式是去查看每个项目的package.json,然后汇总成表格后反馈结果。这种方式最大的成本在于人工翻阅目录,整理表格数据,这中间很容易出错,而且也不容易展示出前端同学的成绩。

身为前端同学,我们就要用前端的方式来展现我们的项目-获取依赖包信息,展示到网页上。

本文技术要点

  1. node解析package.json

  2. 本地服务http-server

  3. shell脚本自动拉取代码

  4. git稀疏检出

下面我们沿着前面的技术要点分别说一下

获取数据源

这里先手动拷贝package.json,到shell那部分时,改成自动获取

创建项目结构

P

|---A

||---package.json

P根目录,A是其中一个需要统计的项目,我们需要从package.json文件中读取dependencies下的模块信息。

利用node的fs模块来实现这个目标,在根路径下新建getData.js文件

代码如下

getData.js

const fs = require('fs')const path = require('path')const { log } = console;/*** 获取路径下package.json文件列表*/function readFileList(dir, filesList = []) {    const files = fs.readdirSync(dir)    files.forEach(item => {        const fullPath = path.join(dir, item)        const stat = fs.statSync(fullPath)        if (stat.isDirectory()) {            readFileList(fullPath, filesList)        } else {      if( fullPath.indexOf('package.json') > -1 ){        filesList.push(fullPath)      }                    }    })}let filesList = [];readFileList(__dirname, filesList);/*** 生成便于页面展示的json数据*/let depData = []filesList.forEach(item => {    const data = fs.readFileSync(item, {        encoding: 'utf-8'    })    let _data = JSON.parse(data)    let _tempData = {}    _tempData['name'] = _data.name;    _tempData['dependencies'] = _data.dependencies;    depData.push(_tempData)})/*** 把收集到的信息写入data.json文件,供网页展示*/fs.writeFile('./data.json', JSON.stringify(depData), err => {    if( err ) {        log(err)    } else {        console.log('get data success!!!!')    }    })

在命令行执行:

node getData.js

生成需要的数据源 data.json

结构如下:

[    {        "name":"h5-a",        "dependencies":{            "@babel/compat-data":"^7.11.0",            "axios":"^0.19.2",            "core-js":"^3.6.4",            "dayjs":"^1.8.22",            "flex.css":"^1.1.7",            "js-cookie":"^2.2.1",            "qs":"^6.9.1",            "vant":"^2.5.4",            "vue":"^2.6.11",            "vue-axios":"^2.1.5",            "vue-localstorage":"^0.6.2",            "vue-router":"^3.1.5",            "vuex":"^3.1.2"        }    }]

接下来就是把数据展示到网页上,这里利用本地vue文件来处理,ajax请求获取数据

直接上代码

index.html

<html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Documenttitle>    <style type="text/css">        .flex {display: flex; justify-content:space-between;}        ul {margin:0; padding:0;}        li {list-style: none;}        li:hover {background:rgb(188, 143, 143)}        p { margin:2px 0;}        div {flex:1;border-right:1px solid #ccc;}        div:nth-of-type(2n) {background:#ece6e665}        .title { font-weight: bolder; text-align: center; }        .item-title{padding-left: 8px; background: #cbb9eb57;}        .item-value{text-align: right;}style>head><body>    <section id="app" class="flex">        <div v-for="(item, index) in dataList" :key="index">            <p class="title">{{ item.name }}p>            <ul>                <li v-for="(value, name) in item.dependencies" :key="value">                    <p class="item-title">{{ name }}p>                    <p class="item-value">{{ value }}p>                li>            ul>        div>    section>    <script src="./vue.min.js">script>    <script>        const app = new Vue({            el: '#app',            data: {                                dataList: null                            },            mounted() {                this.getData();            },            methods: {                getData() {                    const _this = this;                    const request = new XMLHttpRequest();                    request.overrideMimeType("application/json");                    request.open('GET', './data.json', true);                                        request.onreadystatechange = function () {                        if (request.readyState === 4 && request.status === 200) {                            _this.dataList = JSON.parse(request.responseText)                            console.log(_this.dataList)                        } else {                            console.log('error')                        }                    }                    request.send(null);                }            },        })script>body>html>

数据和展示的页面都已经准备就绪,再来一个web服务就可以启动查看效果了。

http-server

我选择了npm包http-server来做web服务,非常的便捷。

先安装http-server模块,可以全局安装,这样随时随地可以启动你的web服务了

npm install -g http-server

安装后,打开命令行,在根目录P下执行 http-server,

nick@Z0410100112 MINGW64 /d/p$ http-serverStarting up http-server, serving ./Available on:  http://192.168.1.9:8080  http://127.0.0.1:8080Hit CTRL-C to stop the server

打开浏览器,输入地址http://127.0.0.1:8080,就可以访问页面看看效果了

01a6a49074d050e166237809438385ce.png

这样我们就完成了对项目依赖包的解析,本地web服务的展示了。

shell+git稀疏检出

上面的demo中我们只用了一个项目,如果有多个项目呢,还这样效率就有点低了。于是就有个问题,能不能自动去拉取项目的package.json文件呢?

经过一番思考,找到解决方案了,利用shell脚本来自动执行git拉取代码的命令,多个项目,就循环执行就好了。由于我们只需要package.json文件,所以还需要配置git的稀疏检出。

在根目录P下面新建pull.sh文件,

pull.sh

#!/bin/bashecho "Start to pull file"# 配置多个项目的git地址project_git=('git@git.x.com:fe/h5-a.git''git@git.x.com:fe/h5-b.git''git@git.x.com:fe/h5-c.git''git@git.x.com:fe/h5-d.git')for item in ${project_git[*]}do  echo $item  name=${item#*/}  name=${name%.git}  echo ${name}    mkdir ${name}  cd ${name}    git init  git remote add origin ${item}  # 配置稀疏检出  git config  core.sparseCheckout true   # 只检出package.json文件  echo 'package.json' >> .git/info/sparse-checkout    git pull origin master      cd ../  doneecho "Finished pulling file"#拉取文件后,在执行一个命令,去生成需要的数据node getData.js

执行上面的pull.sh脚本,就可以自动完成多项目的package.json文件拉取,生成展示的数据文件。只需要启动本地web服务,就可以展示所有项目的依赖包了。

完整的demo目录结构:

p

├── getData.js

├── index.html

├── pull.sh

└── vue.min.js

执行pull.sh脚本后,目录结构为:

p

├── data.json

├── getData.js

├── h5-a

│   └── package.json

├── h5-b

│   └── package.json

├── h5-c

│   └── package.json

├── h5-d

│   └── package.json

├── index.html

├── pull.sh

└── vue.min.js

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值