Commit 3e142142 authored by haiyoucuv's avatar haiyoucuv

集成game-cli服务

parent 7bf22da3
# Default ignored files
/workspace.xml
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/zeroing-libs.iml" filepath="$PROJECT_DIR$/.idea/zeroing-libs.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
const program = require('commander');
const {exit, executeBuildProcess, updateBuildConfig} = require('./tools');
program
.option('-u, --upload-auto', 'Auto upload after build success', false)
.parse(process.argv);
async function execute() {
const version = await executeBuildProcess('build');
//console.log('detected version:', version);
updateBuildConfig('version', version);
if(program.uploadAuto){
console.log('\nAuto uploading...');
require('./game-cli-upload');
}
}
execute().catch(e => {
exit(e);
});
#!/usr/bin/env node
/**
* Created by rockyl on 2019-12-25.
*/
const program = require('commander');
const {start} = require('../src');
program
.option('-p, --port [string]', 'Server port', '7788')
.option('-f, --file [string]', 'Target file')
.parse(process.argv);
if(!program.file){
console.error('Target file must be specified');
}else{
start(program);
}
const program = require('commander');
const {exit, executeBuildProcess} = require('./tools');
program
.parse(process.argv);
async function execute() {
await executeBuildProcess('compile');
}
execute().catch(e => {
exit(e);
});
const program = require('commander');
const {exit, executeBuildProcess} = require('./tools');
program
.parse(process.argv);
async function execute() {
await executeBuildProcess('dev');
}
execute().catch(e => {
exit(e);
});
const fs = require('fs-extra');
const path = require('path');
const program = require('commander');
const {exit, gitClone, npmInstall} = require('./tools');
program
.option('-f, --force', 'Delete the old project')
.option('-t, --template [string]', 'Template of repository ext. etc. egret', 'egret')
.option('-r, --repository [string]', 'Template from repository')
.parse(process.argv);
const args = program.args;
const templateName = program.repository || ('game-template-' + program.template);
if (!args.length) {
exit('Project name required', 1);
}
const projectName = args[0];
let configFile, config;
function prepareProjectPath() {
return new Promise((resolve, reject) => {
if (program.force) {
console.log('Deleting the old project');
fs.removeSync(projectName);
resolve();
} else if (fs.existsSync(projectName)) {
reject(`Project named ${projectName} exist`);
} else {
resolve();
}
});
}
function prepareConfig() {
return new Promise((resolve, reject) => {
configFile = path.resolve(projectName, 'template-config.js');
if (fs.existsSync(configFile)) {
config = require(configFile);
}
resolve();
});
}
function cloneTemplate() {
console.log('Cloning template...');
const url = program.repository ? templateName : `git@gitlab2.dui88.com:laoqifeng/${templateName}.git`;
console.log('Cloning template from', url);
return gitClone(url, projectName).then(
() => {
console.log('Clone template success');
},
(e) => {
return Promise.reject('Clone template failed with err:' + e)
}
);
}
async function copyTemplate() {
console.log('Coping template...');
await fs.copy('../' + templateName, projectName);
console.log('Copy template success');
}
async function replaceProcess() {
return new Promise((resolve, reject) => {
if (config) {
const {replaces: {constants, contentInFiles, nameOfFiles}} = config;
constants.projectName = projectName;
contentInFiles.forEach(file => {
let filePath = path.resolve(projectName, file);
let content = fs.readFileSync(filePath, 'utf-8');
for (let key in constants) {
content = content.replace(`{${key}}`, constants[key])
}
fs.writeFileSync(filePath, content);
});
nameOfFiles.forEach(file => {
let newFile = file;
let result = newFile.match(/\{\w+\}/g);
result.forEach(item => {
let key = item.substr(1, item.length - 2);
newFile = newFile.replace(item, constants[key]);
});
fs.moveSync(path.resolve(projectName, file), path.resolve(projectName, newFile));
});
resolve();
} else {
reject('template-config.js is not exist');
}
})
}
function deleteProcess() {
const ps = [];
const {deletes} = config;
if (deletes) {
for (let item of deletes) {
const file = path.resolve(projectName, item);
if (fs.existsSync(file)) {
ps.push(fs.remove(file));
}
}
}
return Promise.all(ps);
}
async function npm() {
console.log('Installing node packages...');
await npmInstall(path.resolve(projectName));
console.log('Installing node packages success...');
}
function windingUp() {
fs.removeSync(configFile);
}
async function execute() {
await prepareProjectPath();
await cloneTemplate();
//await copyTemplate();
await prepareConfig();
if(config) await replaceProcess();
await npm();
if(config) await deleteProcess();
await windingUp();
console.log('Init project success');
}
execute().catch(e => {
exit(e);
});
const program = require('commander');
const {exit,} = require('./tools');
const jsonServer = require('./json-server');
program
.option('-h, --host [string]', 'server host', 'localhost')
.option('-p, --port [number]', 'server port', 3000)
.option('--proxy [string]', 'server proxy address')
.option('-f, --folder [string]', 'folder of json files', './')
.option('-k, --key-file [string]', 'ssl key file')
.option('-c, --cert-file [string]', 'ssl cert file')
.parse(process.argv);
async function execute() {
console.log('Launching...');
jsonServer.start({
host: program.host,
port: program.port,
proxy: program.proxy,
folder: program.folder,
keyFile: program.keyFile,
certFile: program.certFile,
}).then(
({host, port, jsonPath, isSSL})=>{
const schema = isSSL ? 'https' : 'http';
console.log(`${schema} server start at ${schema}://${host}:${port}`);
console.log(`${schema} path: ${jsonPath}`);
},
(e)=>{
console.log(e);
}
)
}
execute().catch(e => {
exit(e);
});
const program = require('commander');
const {exit,} = require('./tools');
const httpServer = require('./http-server');
program
.option('-h, --host [string]', 'server host', 'localhost')
.option('-p, --port [number]', 'server port', 3001)
.option('-f, --folder [string]', 'folder of static files', './')
.option('-k, --key-file [string]', 'ssl key file')
.option('-c, --cert-file [string]', 'ssl cert file')
.parse(process.argv);
async function execute() {
console.log('Launching...');
httpServer.start({
host: program.host,
port: program.port,
folder: program.folder,
keyFile: program.keyFile,
certFile: program.certFile,
}).then(
({host, port, publicPath, isSSL})=>{
const schema = isSSL ? 'https' : 'http';
console.log(`${schema} server start at ${schema}://${host}:${port}`);
console.log(`${schema} path: ${publicPath}`);
},
(e)=>{
console.log(e);
}
)
}
execute().catch(e => {
exit(e);
});
const path = require('path');
const program = require('commander');
const {exit, getBuildConfig} = require('./tools');
const ossUpload = require('./oss-upload');
program
.option('-v, --version-code [string]', 'Version to upload')
.option('-m, --mode [string]', 'prod or test', 'prod')
.parse(process.argv);
async function execute() {
let remotePath;
let version = program.versionCode;
let releasePath = './bin-release/web/';
const buildConfig = getBuildConfig();
if(buildConfig){
remotePath = buildConfig['remote-path'];
version = version ? version : buildConfig['version'];
releasePath = buildConfig['release-path'] || releasePath;
}
if(version){
console.log('upload version:', version);
if(remotePath){
try {
await ossUpload({
localDir: path.join(releasePath, version),
remoteDir: `/db_games/${remotePath}/${version}`
}, program.mode);
}catch (e) {
exit(e.message, 3)
}
}else{
exit('remote-path setting is not exist', 2)
}
}else{
exit('Can\'t find version argument or project setting', 3)
}
}
execute().catch(e => {
exit(e);
});
#!/usr/bin/env node
const program = require('commander');
program
.version('1.0.3')
.description('game command line interface')
.command('init [name]', 'Initialize a project with template').alias('i')
.command('mock', 'Mock server').alias('m')
.command('serve', 'Http server').alias('s')
.command('compile', 'Compile project').alias('c')
.command('dev', 'Build project automatic').alias('d')
.command('build', 'Publish project').alias('b')
.command('upload', 'Upload project to oss').alias('u')
.command('code-serve', 'Code sync serve')
.parse(process.argv);
/**
* Created by rockyl on 2018/9/18.
*
* http serve
*/
const path = require('path');
const fs = require('fs');
const serveHandler = require('serve-handler');
const http = require('http');
const https = require('https');
let publicPath;
function handler(request, response) {
return serveHandler(request, response, {
public: publicPath,
headers: [
{
source: '**/*',
headers: [
{
key: 'Access-Control-Allow-Origin', value: '*',
}
]
}
]
});
}
exports.start = function (options) {
return new Promise((resolve, reject) => {
const {port, host, folder, keyFile, certFile} = options;
publicPath = path.resolve(folder);
if (fs.existsSync(publicPath)) {
let sslOpts;
if (keyFile && certFile) {
const keyContent = fs.readFileSync(keyFile, 'utf8'),
certContent = fs.readFileSync(certFile, 'utf8');
if (keyContent && certContent) {
sslOpts = {
key: keyContent,
cert: certContent
};
}
}
const server = sslOpts ? https.createServer(sslOpts, handler) : http.createServer(handler);
server.on('error', (err) => {
reject(err.message);
});
server.listen(port, host, function () {
resolve({
host, port, publicPath, isSSL: !!sslOpts
});
});
} else {
reject('Public path is not exist: ' + publicPath)
}
})
};
/**
* Created by rockyl on 2018/9/18.
*
* json server
*/
const path = require('path');
const fs = require('fs');
const http = require('http');
const https = require('https');
const httpProxy = require('http-proxy');
const proxyServer = httpProxy.createProxyServer({});
function handler(jsonPath, proxy) {
return function (request, response) {
const {url} = request;
if (url === '/favicon.ico') {
response.writeHead(200);
response.end();
return;
}
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST,GET,PUT,OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type,Access-Token',
};
if (proxy) {
const target = proxy.startsWith('http') ? proxy : `http://${proxy}`;
console.log(`proxy: ${target}${url}`);
Object.entries(headers).forEach(([key, val]) => response.setHeader(key, val));
return proxyServer.web(request, response, { target }, err => {
console.log(err);
})
}
const pos = url.indexOf('?');
const fileUri = pos < 0 ? url : url.substring(0, pos);
console.log('mook: ', request.method, fileUri);
const filePath = path.join(jsonPath, fileUri);
let content, targetFile;
if (fs.existsSync(targetFile = filePath + '.json')) {
content = fs.readFileSync(targetFile, 'utf-8');
} else if (fs.existsSync(targetFile = filePath + '/index.js')) {
try {
const jsonObject = require(targetFile)();
content = JSON.stringify(jsonObject);
} catch (e) {
console.log(e);
content = e.toString();
}
}
if (content) {
response.writeHead(200, headers);
response.write(content);
} else {
response.writeHead(404, headers);
response.write(JSON.stringify({
'msg': `.json or /index.js not found, please check ${filePath}`,
}))
}
response.end();
}
}
exports.start = function (options) {
return new Promise((resolve, reject) => {
const {port, host, proxy, folder, keyFile, certFile} = options;
const jsonPath = path.resolve(folder);
if (fs.existsSync(jsonPath)) {
let sslOpts;
if(keyFile && certFile){
const keyContent = fs.readFileSync(keyFile, 'utf8'),
certContent = fs.readFileSync(certFile, 'utf8');
if(keyContent && certContent){
sslOpts = {
key: keyContent,
cert: certContent
};
}
}
const server = sslOpts ? https.createServer(sslOpts, handler(jsonPath, proxy)) : http.createServer(handler(jsonPath, proxy));
server.on('error', (err) => {
reject(err.message);
});
server.listen(port, host, function () {
resolve({
host, port, jsonPath, isSSL: !!sslOpts
});
});
} else {
reject('Json path is not exist: ' + jsonPath)
}
})
};
const OSS = require('ali-oss');
const chalk = require('chalk');
const ProgressBar = require('progress');
const fs = require('fs');
const path = require('path');
let _type, _options, _store, _bar, _files;
let _uploadFiles, _errorFiles;
module.exports = async function (props, type) {
_type = type;
const defaultOptions = {
localDir: undefined,
remoteDir: undefined
};
_options = Object.assign({}, defaultOptions, props);
if (!_options.localDir || !_options.remoteDir) {
console.log(chalk.red('缺少参数,初始化失败'));
return;
}
init();
await start();
};
function init() {
_files = [];
flattenFileTree(_options.localDir, function(filePath){
_files.push(path.relative(_options.localDir, filePath))
});
_store = new OSS({
region: 'oss-cn-hangzhou',
accessKeyId: 'LTAIdGi1IOap7fkF',
accessKeySecret: 'SKrOOp6EVtDGEV47yn0t2h97gyNioQ',
bucket: _type === 'prod' ? 'duiba' : 'daily-duiba'
});
_bar = new ProgressBar(chalk.yellow(` 文件上传中 [:bar] :current/${_files.length} :percent :elapseds`), {
complete: '●',
incomplete: '○',
width: 20,
total: _files.length,
callback: () => {
console.log(chalk.blue(` 本次队列文件共${_files.length}个,上传文件${_uploadFiles}个,上传失败文件${_errorFiles}个`));
}
});
return this;
}
function flattenFileTree(parent, callback){
const filesIn = fs.readdirSync(parent);
for(let file of filesIn){
if(file.indexOf('.DS_Store') < 0){
const filePath = path.join(parent, file);
const stat = fs.lstatSync(filePath);
if(stat.isDirectory()){
flattenFileTree(filePath, callback);
}else{
callback(filePath);
}
}
}
}
async function start(){
_uploadFiles = 0;
_errorFiles = 0;
for(let file of _files){
try {
const localFile = path.join(_options.localDir, file);
const remotePath = path.join(_options.remoteDir, file);
await _store.put(remotePath, localFile);
_uploadFiles += 1;
_bar.tick();
}catch (e) {
_errorFiles += 1;
console.log(e);
}
}
}
/**
* Created by rockyl on 2018/7/5.
*/
const {spawn} = require('child_process');
const fs = require('fs-extra');
const path = require('path');
exports.exit = function (err, code = 1) {
console.error(err);
process.exit(code);
};
const childProcess = exports.childProcess = function (cmd, params, cwd, printLog = true) {
return new Promise((resolve, reject) => {
let options = {};
if (cwd) {
options.cwd = cwd;
}
const proc = spawn(cmd, params, options);
if (printLog) {
proc.stdout.on('data', (data) => {
let txt = data.toString();
txt = txt.substr(0, txt.length - 1);
console.log(txt);
});
proc.stderr.on('data', (data) => {
console.log(data.toString());
});
}
proc.on('close', (code) => {
if (code == 0) {
resolve();
} else {
reject(code);
}
});
});
};
exports.gitClone = function (url, path) {
return childProcess('git', ['clone', url, path]);
};
exports.npmInstall = function (path) {
return childProcess('npm', ['i'], path);
};
exports.npmRun = function (path, scriptName) {
return childProcess('npm', ['run', scriptName], path);
};
const packageJsonFile = path.resolve('./package.json');
let packageObj;
function ensurePackage() {
if (packageObj) {
return packageObj;
}else{
if (fs.existsSync(packageJsonFile)) {
packageObj = require(packageJsonFile);
return packageObj;
} else {
console.log('package.json is not exist');
}
}
}
function savePackage(){
if(packageObj){
fs.writeFileSync(packageJsonFile, JSON.stringify(packageObj, null, '\t'));
}
}
const getBuildConfig = exports.getBuildConfig = function () {
if(!ensurePackage()){
console.log('package.json is not exist');
return;
}
let build = packageObj.build;
if (!build) {
build = packageObj.build = {};
}
return build;
};
exports.updateBuildConfig = function (key, value) {
const build = getBuildConfig();
build[key] = value;
savePackage();
};
function findGlobalModulePath(moduleName){
const npm = require('global-modules');
let modulePath = path.resolve(npm, moduleName);
if(fs.existsSync(modulePath)){
return modulePath;
}
const yarnModules = require('yarn-config-directory')();
modulePath = path.resolve(yarnModules, 'global', moduleName);
if(fs.existsSync(modulePath)){
return modulePath;
}
modulePath = path.resolve(yarnModules, 'link', moduleName);
if(fs.existsSync(modulePath)){
return modulePath;
}
}
exports.executeBuildProcess = function (cmd) {
return new Promise((resolve, reject) => {
let buildProcessName;
const buildConfig = getBuildConfig();
try {
buildProcessName = buildConfig['build-process'];
}catch (e) {
console.log('invalid manifest config')
}
if (buildProcessName) {
let globalModulePath = findGlobalModulePath('game-cli-build-process-' + buildProcessName);
try {
const buildProcess = require(globalModulePath);
if (buildProcess.hasOwnProperty(cmd)) {
resolve(buildProcess);
} else {
console.log(`Build process [${buildProcessName}] has not implement ${cmd} function`)
}
} catch (e) {
console.log(e);
reject('Build process is not found, please install with --global\n' + 'GLOBAL_NPM_PATH: ' + globalModulePath);
}
}
reject('Build process name is not found, please setup ' + packageJsonFile);
}).then(
(buildProcess) => {
return buildProcess[cmd]()
}
).then(
(version) => {
console.log(`Build process [${cmd}] execute success`);
return version;
}
)
};
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
{
"_from": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"_id": "game-cli@1.0.4",
"_inBundle": false,
"_integrity": "",
"_location": "/game-cli",
"_phantomChildren": {},
"_requested": {
"type": "git",
"raw": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"rawSpec": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"saveSpec": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"fetchSpec": "http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"gitCommittish": null
},
"_requiredBy": [
"#DEV:/",
"#USER"
],
"_resolved": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git#9d404bebb4ffbfdbb70b3a7bb44e7c048def6cbd",
"_spec": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"_where": "/Users/haiyoucuv/Documents/Web/烽火台/zeroing-libs",
"author": {
"name": "rocky.l"
},
"bin": {
"game-cli": "bin/game-cli.js"
},
"bundleDependencies": false,
"dependencies": {
"ali-oss": "^6.0.1",
"chalk": "^2.4.1",
"commander": "^2.18.0",
"fs-extra": "^8.1.0",
"global-modules": "^2.0.0",
"http-proxy": "^1.17.0",
"progress": "^2.0.0",
"serve-handler": "^5.0.5",
"socket.io": "^2.3.0",
"yarn-config-directory": "^1.0.2"
},
"deprecated": false,
"description": "game command-line interface for duiba game developing",
"license": "ISC",
"main": "index.js",
"name": "game-cli",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"version": "1.0.4"
}
/**
* Created by rockyl on 2019-12-25.
*/
const Server = require('socket.io');
const path = require('path');
const fs = require('fs-extra');
exports.start = function (options) {
const sockets = [];
let watching = false;
fs.watch(options.file + '/temp.ts', {}, (eventType) => {
if (watching) {
if (eventType === 'change') {
const code = fs.readFileSync(options.file + '/temp.ts', 'utf-8');
for (let socket of sockets) {
socket.emit('edit-save', code);
}
}
}
});
let server = Server(options.port);
server.on('connection', function (socket) {
sockets.push(socket);
socket.on('disconnect', function () {
sockets.splice(sockets.indexOf(socket), 1);
});
socket.on('edit-open', function (script) {
const dirname = path.dirname(options.file + '/temp.ts');
fs.ensureDirSync(dirname);
watching = false;
fs.writeFileSync(`${options.file}/temp.ts`, script);
setTimeout(function () {
watching = true;
}, 500);
})
});
console.log('Code server started on port:', options.port);
};
/**
* Created by rockyl on 2019-12-25.
*/
const Server = require('socket.io');
const path = require('path');
const fs = require('fs-extra');
exports.start = function (options) {
const sockets = [];
let watching = false;
fs.watch(options.file, {}, (eventType) => {
if (watching) {
if (eventType === 'change') {
const code = fs.readFileSync(options.file, 'utf-8');
for (let socket of sockets) {
socket.emit('edit-save', code);
}
}
}
});
let server = Server(options.port);
server.on('connection', function (socket) {
sockets.push(socket);
socket.on('disconnect', function () {
sockets.splice(sockets.indexOf(socket), 1);
});
socket.on('edit-open', function (meta) {
const dirname = path.dirname(options.file);
fs.ensureDirSync(dirname);
watching = false;
const {script, props, output} = meta;
let propsCodeLines = [];
for (let key in props) {
const {alias, type, enum: enumValues, default: defaultValue} = props[key];
let typeStr = 'string';
switch (type) {
case 'enum':
typeStr = enumValues.map(item => `'${item}'`).join('|');
break;
case 'color':
case 'asset':
break;
case 'node':
typeStr = 'NodeClass';
break;
case 'dynamic':
case 'map':
typeStr = 'any';
break;
default:
typeStr = type;
}
propsCodeLines.push(` //${alias}
${key}: ${typeStr};
`);
}
let outputsStr = output.map(item => `'${item}'`).join('|');
let nextTypes = `declare function next(type: ${outputsStr}, payload?: any);`;
let metaDts = `declare interface ProcessProps {
${propsCodeLines.join('\n')}
}
${nextTypes}
`;
fs.writeFileSync(path.join(dirname, 'meta.d.ts'), metaDts);
fs.writeFileSync(options.file, script);
setTimeout(function () {
watching = true;
}, 500);
})
});
console.log('Code server started on port:', options.port);
};
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = localhost, LLC
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = localhost
emailAddress = Email Address
emailAddress_default = test@example.com
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = localhost
IP.1 = 192.168.95.2
IP.2 = 172.31.51.89
\ No newline at end of file
#!/bin/bash
openssl req -config localhost.conf -new -sha256 -newkey rsa:2048 -nodes -keyout localhost.key -x509 -days 365 -out localhost.crt
cat localhost.crt localhost.key > localhost.pem
\ No newline at end of file
This diff is collapsed.
......@@ -6,10 +6,12 @@
"scripts": {
"build-process": "node scripts/compiler-process",
"build-script": "node scripts/compiler-script",
"build-custom": "node scripts/compiler-custom"
"build-custom": "node scripts/compiler-custom",
"code-serve": "node game-cli/bin/game-cli-code-serve.js -f src/custom/temp"
},
"devDependencies": {
"fs-extra": "^8.1.0",
"game-cli": "git+http://gitlab2.dui88.com/laoqifeng/game-cli.git",
"rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-progress": "^1.1.1",
......
{
"name": "Test1",
"props": {
},
"assets": [
{
"url": "//yun.duiba.com.cn/aurora/af90069732223c75818c4799b3130bd0f0ad4ff8.png",
"ext": ".png"
}
]
}
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment