Skip to content

Commit

Permalink
Iceworks/release 2.15.1 (#1336)
Browse files Browse the repository at this point in the history
* feat: 根据项目的package.json中的依赖判断区块下载版本

1. 移除scan-layout 中从远端获取数据的相关逻辑,只取项目本地的
2. 创建页面时的下载区块逻辑和下载区块到页面的逻辑统一
3. 移除commonBlock的判断:创建是都是传入true,没必要。

* chore: optimize

* chore: 版本判断优化

* chore: 语义化

* chore:逻辑判断变更

* Iceworks/bugfix adapter (#1331)

* fix: 依赖获取判断逻辑添加

* chore: version-0.x字段 指向新版本  1.x

* fix: 同步执行区块下载,否则会先生成页面导致找不到区块依赖

* chore: changelog

* chore: changelog
  • Loading branch information
fenglai0802 authored and chenbin92 committed Jan 16, 2019
1 parent 3441dee commit 71b01a9
Show file tree
Hide file tree
Showing 17 changed files with 96 additions and 248 deletions.
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
File renamed without changes.
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

0 comments on commit 71b01a9

Please sign in to comment.