Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Iceworks/release 2.15.1 #1336

Merged
merged 11 commits into from
Jan 16, 2019
1 change: 0 additions & 1 deletion tools/iceworks/app/main/scaffolder/bin/create-ice-page.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ createICEApp
description: '堆叠区域图',
},
],
commonBlock: true,
interpreter: ({ type, message, data }, callback) => {
console.log(message);
switch (type) {
Expand Down
14 changes: 0 additions & 14 deletions tools/iceworks/app/main/scaffolder/bin/scan-layout.js

This file was deleted.

178 changes: 26 additions & 152 deletions tools/iceworks/app/main/scaffolder/lib/createPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ module.exports = async function createPage({
blocks = [],
interpreter,
isNodeProject, //是否是koa项目
commonBlock = false, // 是否在 page 下生成 components 目录, 默认否
preview = false, // 用来生成 preview page 做预览使用
builtIn = false, // 如果设置为 true, 文件冲突情况下不再询问, 直接忽略
libary = 'react', // hack 用于识别 vue 项目做特殊处理
excludeLayout = false,
}) {
let fileList = [];
const layoutName = layout.name;
routePath = routePath || pageName;

// 获取当前项目的package.json中的数据
Expand Down Expand Up @@ -100,75 +100,38 @@ module.exports = async function createPage({
}
}

// 1. blocks 依赖获取, 过滤掉已安装的内容
const blockDeps = {}; // 存储未安装的依赖
// 1. 下载区块
if (Array.isArray(blocks)) {
// merge dependence
for (let i = 0; i < blocks.length; i++) {
const block = blocks[i];
// todo block 可以是任何内容,可以不是一个 NPM 包
if(block.type == 'custom'){
const customDependencies = JSON.parse(block.dep);
customDependencies.forEach((dep) => {
const customDepsVersion = dep.version;
// 跳过已有依赖,未安装依赖放入blockDeps
if (!pkg.dependencies.hasOwnProperty(dep.npmName)) {
blockDeps[dep.npmName] = customDepsVersion;
}
});
continue;
}
// 获取物料中的依赖
const dependencies = await materialUtils.getDependenciesByMaterial(block);
Object.keys(dependencies).forEach((dep) => {
const version = dependencies[dep];
// 跳过已有依赖,未安装依赖放入blockDeps
if (!pkg.dependencies.hasOwnProperty(dep)) {
blockDeps[dep] = version;
}
});
}
}
// className、relativePath用于ejs模板语言生成page.jsx
blocks.forEach( block => {
const blockFolderName = block.alias || upperCamelCase(block.name) || block.className; // block 目录名
// 转换了 alias 的名称
const blockClassName = upperCamelCase(
block.alias || block.className || block.name
);
block.className = blockClassName;
// block 的相对路径,生成到页面的 components 下面
block.relativePath = `./components/${blockFolderName}`;
})

const layoutDeps = {};
let layoutName = '';
if (layout) {
// 兼容 layout 不存在的情况, 拉取最新的 layout
layoutName = layout.name;
// 判断当前文件是否存在
// XXX 文件名被修改存在错误风险
const layoutOutputPath = isNodeProject
? path.join(destDir, 'client/layouts', layout.name)
: path.join(destDir, 'src/layouts', layout.name);
const layoutExists = fs.existsSync(layoutOutputPath);
if (
!excludeLayout &&
!layout.localization && // 本地 Layout 不创建
!layoutExists
) {
// 3. 生成 layout 文件
const url = await materialUtils.getTarballURLBySource(layout.source);
const dependencies = materialUtils.getDependenciesByMaterial(layout);
Object.keys(dependencies).forEach((dep) => {
const version = dependencies[dep];
if (!pkg.dependencies.hasOwnProperty(dep)) {
layoutDeps[dep] = version;
}
// 下载区块到页面
let dependencies
try {
const deps = await utils.downloadBlocksToPage({
destDir,
blocks,
pageName: pageFolderName,
isNodeProject,
preview
});
const layoutFiles = await utils.extractBlock(
layoutOutputPath,
url,
destDir
);
layoutFiles.forEach((file) => fileList.push(file));
dependencies = deps.dependencies;
} catch (error) {
console.log(err);
}
}

// 1.1 安装 block 依赖
if (Object.keys(blockDeps).length > 0) {
const waitUntilNpmInstalled = await utils.createInterpreter(
'ADD_DEPENDENCIES',
blockDeps,
dependencies,
interpreter
);

Expand All @@ -183,96 +146,7 @@ module.exports = async function createPage({
message: `无法安装以下区块: blocks: ${blocksName} dependencies: ${depsName}`,
});
}
}

// 1.2 安装layout依赖
if (Object.keys(layoutDeps).length > 0) {
const waitUntilNpmInstalled = await utils.createInterpreter(
'ADD_DEPENDENCIES',
layoutDeps,
interpreter
);

if (!waitUntilNpmInstalled) {
const depsName = Object.keys(layoutDeps)
.map((d) => `${d}@${layoutDeps[d]}`)
.join(' ');
throw new DependenciesError('layout 安装失败', {
message: `无法安装以下区块: layout: ${layoutName} dependencies: ${depsName}`,
});
}
}

// 2. 拉取 blocks tar 包,开始下载文件
if (Array.isArray(blocks)) {
for (let i = 0; i < blocks.length; i++) {
const block = blocks[i];
if(!block.type || block.type != 'custom'){
logger.report('app', {
action: 'download-block',
data: {
name: block.name,
},
});
const tarballURL = await materialUtils.getTarballURLBySource(
block.source
);
const blockFolderName = block.alias || upperCamelCase(block.name) || block.className; // block 目录名

let extractPosition = isNodeProject
? 'client/components'
: 'src/components';
// 转换了 alias 的名称
const blockClassName = upperCamelCase(
block.alias || block.className || block.name
);
block.className = blockClassName;
// block 的相对路径
block.relativePath = `../../components/${blockFolderName}`;

if (preview) {
block.relativePath = `./blocks/${blockFolderName}`;
extractPosition = isNodeProject
? 'client/pages/IceworksPreviewPage/blocks'
: 'src/pages/IceworksPreviewPage/blocks';
} else if (commonBlock || block.common) {
// 生成到页面的 components 下面
block.relativePath = `./components/${blockFolderName}`;
extractPosition = isNodeProject
? `client/pages/${pageFolderName}/components`
: `src/pages/${pageFolderName}/components`;
}

const blockExtractedFiles = await utils.extractBlock(
path.join(destDir, extractPosition, blockFolderName),
tarballURL,
destDir
);
fileList = fileList.concat(blockExtractedFiles);
} else {
const blockFolderName = block.alias || upperCamelCase(block.name) || block.className;
let extractPosition = isNodeProject
? `client/pages/${pageFolderName}/components`
: `src/pages/${pageFolderName}/components`;
const blockClassName = blockFolderName;
let codeFileTree = block.code;
block.className = blockClassName;
block.relativePath = `./components/${blockFolderName}`;
mkdirp.sync(path.join(destDir, extractPosition, blockFolderName));
fs.writeFileSync(path.join(destDir, extractPosition, blockFolderName, 'index.jsx'), codeFileTree['index.jsx']);
delete codeFileTree['index.jsx'];
if(Object.keys(codeFileTree).length > 0){
Object.keys(codeFileTree).forEach((element) => {
const folderPath = path.join(destDir, extractPosition, blockFolderName, element);
const folderName = element;
mkdirp.sync(folderPath);
Object.keys(codeFileTree[folderName]).forEach((element) => {
fs.writeFileSync(path.join(folderPath, element), codeFileTree[folderName][element]);
})
})
}
}
}
}

const scaffoldConfig = pkg.scaffoldConfig || {};
Expand Down
42 changes: 40 additions & 2 deletions tools/iceworks/app/main/scaffolder/lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const request = require('request');
const tar = require('tar');
const upperCamelCase = require('uppercamelcase');
const zlib = require('zlib');
const pathExists = require('path-exists');

const config = require('../../config');

Expand All @@ -29,16 +30,25 @@ function downloadBlocksToPage({ destDir = process.cwd(), blocks, pageName, isNod
return Promise.all(
filesList.map((_, idx) => {
const block = blocks[idx];
// 根据项目版本下载依赖
const pkg = getPackageByPath(destDir);
const projectVersion = getProjectVersion(pkg);
// 兼容旧版物料源
if (block.npm && block.version && ( block.type != 'custom' ) ) {
return getDependenciesFromNpm({
npm: block.npm,
version: block.version,
});
} else if (block.source && block.source.type == 'npm' && ( block.type != 'custom' ) ) {
let version = block.source.version;
// 注意!!! 由于接口设计问题,version-0.x 字段实质指向1.x版本!
if (projectVersion === '1.x') {
// 兼容没有'version-0.x'字段的情况
version = block.source['version-0.x'] || block.source.version;
}
return getDependenciesFromNpm({
version,
npm: block.source.npm,
version: block.source.version,
registry: block.source.registry,
});
} else if (block.type == 'custom') {
Expand Down Expand Up @@ -82,6 +92,11 @@ function downloadBlockToPage({ destDir = process.cwd(), block, pageName, isNodeP
name: block.name,
},
});

// 根据项目版本下载依赖
const pkg = getPackageByPath(destDir);
const projectVersion = getProjectVersion(pkg);

if(block.type == 'custom'){
return extractCustomBlock(
block,
Expand All @@ -92,7 +107,7 @@ function downloadBlockToPage({ destDir = process.cwd(), block, pageName, isNodeP
);
}
return materialUtils
.getTarballURLBySource(block.source)
.getTarballURLBySource(block.source, projectVersion)
.then((tarballURL) => {
return extractBlock(
path.join(
Expand All @@ -105,6 +120,29 @@ function downloadBlockToPage({ destDir = process.cwd(), block, pageName, isNodeP
});
}

function getPackageByPath(destDir) {
const pkgPath = path.join(destDir, 'package.json');
if (pathExists.sync(pkgPath)) {
try {
const packageText = fs.readFileSync(pkgPath);
return JSON.parse(packageText.toString());
} catch (e) {}
}
}

/**
* 1. 有 @icedesign/base 相关依赖 则返回 0.x
* 2. 只有 @alifd/next 相关依赖 则返回 1.x
* 3. 都没有 则返回 1.x
* @param {*} pkg
*/
function getProjectVersion(pkg) {
const dependencies = pkg.dependencies || {};
const hasIceDesignBase = dependencies['@icedesign/base'];
return hasIceDesignBase ? '0.x' : '1.x';

}

function extractTarball(tarballURL, destDir) {
// 保证目录存在
// mkdirp.sync(dest);
Expand Down
4 changes: 0 additions & 4 deletions tools/iceworks/app/main/services/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@
* scaffolder
* `removePreviewPage(options:Object):Promise` 移除临时预览文件
* `options.destDir` 所在的项目目录
* `scanLayout(options:Object):Promise` 搜索项目下的 Layout
* `options.destDir` 所在的项目目录
* `createPage(options:Object):Promise` 创建页面
* `options.pageName` 页面名称
* `options.routePath` 路由路径
Expand All @@ -50,12 +48,10 @@
* `options.layout` layout 名
* `options.blocks` 区块队列
* `options.preview` 是否是预览页面
* `commonBlock`: true,
* `interpreter: ({ type, message, data }, next) => {}` 询问回调,根据执行对应的操作
* `createProject():Promise` 生成项目
* `destDir`,
* `scaffolding`,
* `version`,
* `projectName`,
* `commonBlock`: true,
* `interpreter: ({ type, message, data }, next) => {}`
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@ function getOptions(_options, clientTargetPath) {
progressFunc: ( _options.isNodeProject && !clientTargetPath )
? _options.progressFunc.server
: _options.progressFunc.client,
commonBlock: true,
interpreter: ({ type, message }, next) => {
log.info('generate project', type, message);
switch (type) {
Expand Down
10 changes: 9 additions & 1 deletion tools/iceworks/app/main/template/utils/getTarballURLBySource.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@
"type": "npm",
"npm": "@icedesign/foo-block",
"version": "0.1.5",
"version-0.x": "1.0.0",
"sourceCodeDirectory": "src",
},
* "projectVersion": "1.x" // "0.x"

*/
const npmRequest = require('../../utils/npmRequest');

module.exports = function getTarballURLBySource(source = {}) {
module.exports = function getTarballURLBySource(source = {}, projectVersion) {
return new Promise((resolve, reject) => {
let version = source.version;
// 注意!!! 由于接口设计问题,version-0.x 字段实质指向1.x版本!
if (projectVersion === '1.x') {
// 兼容没有'version-0.x'字段的情况
version = source['version-0.x'] || source.version;
}

npmRequest({
name: source.npm,
Expand Down
2 changes: 1 addition & 1 deletion tools/iceworks/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"productName": "Iceworks",
"private": true,
"description": "ICE Desktop Application.",
"version": "2.15.0",
"version": "2.15.1",
"author": {
"name": "Alibaba Group Holding Limited",
"url": "http://alibaba.github.io/ice"
Expand Down
6 changes: 6 additions & 0 deletions tools/iceworks/changelog/2.15.1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"log": [
"特性:适配飞冰物料升级到1.x版本",
"修复:新建页面时,module not found的临时报错"
]
}
Loading