/** * Recursively copy a directory and treat all files as templates * * @param {String} src Source * @param {String} dest Destination * @param {Object} context Context * @private */ _templateDirectory(src, dest, context) { const srcRoot = this.templatePath(src); const destRoot = this.destinationPath(dest); fs.walkSync(srcRoot).forEach(file => { const localPath = file.substr(srcRoot.length); this._mkdirp(path.join(destRoot, path.dirname(localPath))); this._template(file, path.join(destRoot, localPath), context); }, this); }
_scanDir: function (sPath, sExt) { sExt = sExt || '*'; var aScan = []; var aList = []; try { aList = oFS.walkSync(sPath); } catch (e) {} if (!aList.length) { return aScan; } for (var i = 0; i < aList.length; i++) { var sFile = aList[i]; var sItem = oPath.basename(sFile); if (sItem !== '.' && sItem !== '..' && !oFS.statSync(sFile).isDirectory()) { sItem = sItem.split('.'); sItem.shift(); if (sExt === '*' || sItem.join('.') === sExt) { aScan.push(sFile); } } } return aScan; },
.forEach(function (cName) { // 忽略掉 业务组件目录 里的同名组件 // 比如: biz-components 有 button 目录,则意味着您要【自己完全重写实现】button 组件逻辑 if (bizCs.indexOf(cName) > -1) { return; } var sourceDir = path.join(__dirname, './ant-design-mobile/components', cName); var destDir = path.join(destC, cName); if (fs.existsSync(path.join(sourceDir, './index.tsx'))) { // 先 清空或创建 相应 cName 目录 fs.emptyDirSync(destDir); // 创建 相应 cName 目录下的 index.tsx 文件 fs.writeFileSync( path.join(destDir, '/index.tsx'), `import ${camelCase(cName)} from 'antd-mobile/lib/${cName}';\n` + `export default ${camelCase(cName)};\n` ); // 创建 相应 cName 目录下的 examples & docs md 文件 (只是从 antd 拷贝过来) fs.copySync(path.join(sourceDir, '/index.en-US.md'), path.join(destDir, '/index.en-US.md')); fs.copySync(path.join(sourceDir, '/index.zh-CN.md'), path.join(destDir, '/index.zh-CN.md')); fs.copySync(path.join(sourceDir, '/demo'), path.join(destDir, '/demo')); // 删除 用于 react-native 的 demo 文件 del.sync([path.join(destDir, '/demo/*.tsx')]); // 改变 demo 文件中的 `antd-mobile` 组件库名、为 新的 libName fs.walkSync(path.join(destDir, '/demo')).forEach(function (file) { fs.writeFileSync(file, fs.readFileSync(file).toString() .replace(/\sfrom\s'antd-mobile'/g, ` from '${libName}'`)); }); // 同步 带有 locale 目录的组件 if (fs.existsSync(path.join(sourceDir, './locale'))) { var localeDir = path.join(destDir, './locale'); // 在 dest 目录里 清空或创建 locale 目录 fs.emptyDirSync(localeDir); // 暂时 先创建 en 和 zh 两个文件 todos fs.writeFileSync(path.join(localeDir, '/en_US.tsx'), `export { default } from 'antd-mobile/lib/${cName}/locale/en_US';\n`); fs.writeFileSync(path.join(localeDir, '/zh_CN.tsx'), `export { default } from 'antd-mobile/lib/${cName}/locale/zh_CN';\n`); } // 创建 相应 cName 目录下的 style 样式文件 var styleDir = path.join(destDir, './style'); fs.emptyDirSync(styleDir); if (fs.existsSync(path.join(sourceDir, './style/index.less'))) { fs.writeFileSync(path.join(styleDir, './index.less'), `@import '~antd-mobile/lib/${cName}/style/index.less';`); } var indexStyle = path.join(sourceDir, './style/index.tsx'); fs.copySync(indexStyle, path.join(styleDir, '/index.tsx')); // 一个组件可能在 style/index.tsx 里标明依赖另一个组件样式,此时需要确保 被依赖的组件 存在 // var ct = fs.readFileSync(indexStyle); // if (ct.toString().split('\n').filter(function(i) { return i.trim() }).length > 2) { // console.log(` // ========== Note: ${cName} need the following component styles ==== // ${ct}============================================================== // `); // } } });