解决react-native 每次修改完源码后,其他同事无法用,重新npm install无法用的问题

react-native 修改完源码后,如何让其他同事直接能用,每次都发过去修改的node源文件肯定是不方便的,这里分享个脚本

其实我们需要达成的目的是修改NodaModule l的源码其他人也在,但是NodaModule 文件肯定是忽略的,所以我们的思路是新建一个文件,然后按照你NodaModule 修改的文件路径拷贝到新文件(重点 路径名完全一样 )我这新建的文件名字是const_modules,const_modules不被git 忽略

然后我们写个脚本文件init文件。每次执行之后都会按照const_modules里面的文件全部 复制替换到NodaModule这样就完成了所有操作

在这里插入图片描述
init文件代码


var fs = require('fs');//引用文件系统模块
var copy = require('./copy');

/**
 * 生成清单
 */
function gennerateResource(fileName) {
    try {
        var notice = `\n//!!!!!代码自动生成,请勿手动修改!!!!!\n`;
        var content = `\n/**\n* @author liuchengfei  E-mail:13717883106@163.com\n* @Description 资源清单\n*/\n`;

        var images = `export const Image={\n${listImages("./app/resources/imgs")}\n};`;
        var colors = `export const Color={\n${listColors("./app/resources/colors")}\n};`;

        content = `${content}
     \n${notice}\n${listCommonAPI()}
    \n${notice}\n${images}
    \n${notice}\n${colors}`;
        fs.writeFileSync(fileName, content);
    } catch (error) {
        console.error('!!!!!!!!!!!!!!!!!!文件格式不正确,请检查!!!!!!!!!!!!!!!!!!!!' + error)
    }
}

function listCommonAPI() {
    var stringFunc = `\nexport function getString(funcStr:string){`
        .concat(`\n`)
        .concat(`\ttry{`)
        .concat(`\n\treturn eval("String."+funcStr+"()");}`)
        .concat(`\n\tcatch(error){}`)
        .concat(`\n\treturn '';`)
        .concat(`\n}`);
    var imageFunc = `\nexport function getImage(funcStr:string){`
        .concat(`\n`)
        .concat(`\ttry{`)
        .concat(`\n\treturn eval("Image."+funcStr+"()");}`)
        .concat(`\n\tcatch(error){}`)
        .concat(`\n\treturn 0;`)
        .concat(`\n}`);
    return stringFunc.concat(imageFunc);
}


/**
 * 列出图片清单
 * @param dirPath
 * @param fileName
 * @returns {string}
 */
function listImages(dirPath) {
    var content = ``;
    var files = fs.readdirSync(dirPath);
    files.forEach(function (itm, index) {
        if (itm.endsWith('.png') && !(itm.includes('@2x') || itm.includes('@3x'))) {
            content = `${content}\t${itm.replace('.png', '')}:()=>require('${dirPath}/${itm}'),\n`;
        } else  if (itm.endsWith('.gif') && !(itm.includes('@2x') || itm.includes('@3x'))) {
            content = `${content}\t${itm.replace('.gif', '')}:()=>require('${dirPath}/${itm}'),\n`;
        } else if(itm.endsWith('.jpeg') && !(itm.includes('@2x') || itm.includes('@3x'))){
            content = `${content}\t${itm.replace('.jpeg', '')}:()=>require('${dirPath}/${itm}'),\n`;
        } else if(itm.endsWith('.jpg') && !(itm.includes('@2x') || itm.includes('@3x'))){
            content = `${content}\t${itm.replace('.jpg', '')}:()=>require('${dirPath}/${itm}'),\n`;
        }
    });
    return content;
}

/**
 * 列出所有的颜色
 * 1个目录对应多个color.json文件
 *  1.需要解决声明重复问题
 *  2.需要不同的命名空间
 * @param dirPath
 */
function listColors(dirPath) {
    let colorResource = '';
    var files = fs.readdirSync(dirPath);
    files.forEach(function (itm, index) {
        if (itm.endsWith('.json')) {
            var data = fs.readFileSync(`${dirPath}/${itm}`);
            let jsonObj = JSON.parse(data.toString());
            Object.keys(jsonObj).map((key) => {
                colorResource = `${colorResource}\t${key}:()=>"${jsonObj[key]}",\n`
            });
        } else {
            throw new Error('you must rename filename endwith .json')
        }
    });
    if (colorResource) {
        colorResource = colorResource.substring(0, colorResource.lastIndexOf(','));
    }
    //console.log(`colorResource:\n` + colorResource);
    return colorResource;
}

function watch(dirStr) {
    var stat = fs.statSync(dirStr)
    if (stat.isDirectory()) {
        return fs.watchFile(
            dirStr,
            {
                persistent: true,
                interval: 100,
                recursive: true,
            }, (currStat) => {
                console.log("文件被修改,重新生成!");
                gennerateResource('Resource.ts');
            });
    }
    return null;
}

//小心勿动
gennerateResource('Resource.ts');
let watchers = [];
for (let watcher of watchers) {
    if (watcher) {
        watcher.unwatch();
    }
}

function fsExistsSync(path) {
    try{
        fs.accessSync(path,fs.F_OK);
    }catch(e){
        return false;
    }
    return true;
}

function rmdir(dirStr) {

    let files = [];
    if(fs.existsSync(dirStr)){
        files = fs.readdirSync(dirStr);
        files.forEach((file, index) => {
            let curPath = dirStr + "/" + file;
            if(fs.statSync(curPath).isDirectory()){
                rmdir(curPath); //递归删除文件夹
            } else {
                fs.unlinkSync(curPath); //删除文件
            }
        });
        fs.rmdirSync(dirStr);
        console.log('删除目录成功');
    }

}
rmdir('node_modules/react-native-af-video-player/node_modules');// 需要删除的文件源目录react-native-af-video-player 下 重复的react-native-video 文件依赖

copy里面的代码

var fs = require('fs');

//以下为拷贝文件夹操作
var copy = function(src, dst) {
  let paths = fs.readdirSync(src); //同步读取当前目录
  paths.forEach(function(path) {
    var _src = src + '/' + path;
    var _dst = dst + '/' + path;
    if (fs.statSync(_src).isFile()) {
      let readable = fs.createReadStream(_src); //创建读取流
      let writable = fs.createWriteStream(_dst); //创建写入流
      readable.pipe(writable);
    } else {
      checkDirectory(_src, _dst, copy);
    }
  });
};

function fsExistsSync(path) {
  try {
    fs.accessSync(path, fs.F_OK);
  } catch (e) {
    return false;
  }
  return true;
}

var checkDirectory = function(src, dst, callback) {
  if (fsExistsSync(dst)) {
    callback(src, dst);
  } else {
    fs.mkdirSync(dst);
    callback(src, dst);
  }
};

function loopCopy(src, dest) {
  console.log('from:', src);
  checkDirectory(src, dest, copy);
  console.log('===>', dest);
}

loopCopy('./const_modules', './node_modules/');

这里的代码是包含图片和颜色都替换,然后统一生成一个 Resource文件。之后项目所有用到颜色 和图片的地方都可以用,用法:

import * as Resource from '../../../Resource';
color: Resource.Color.common_black_0e()
<Image style={{width: iconSize, height: iconSize}} source={Resource.Image.home_card_no_open()}/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值