使用gulp将typescript导出到json文件

时间:2016-04-25 14:15:08

标签: javascript angularjs json typescript gulp

我有几个打字稿文件,其中一些导出一个名为APIS的变量 - 这是一个对象数组。 我想提取所有这些导出的值,并使用gulp将它们传递给json文件。

例如,我有一个名为services的文件夹,包含3个文件:service1.ts,service2.ts,service3.ts。

service1.ts:

...
export const APIS = [ { "field1" : "blabla" } ];

service2.ts:

...
export const APIS = [ { "field2" : "yadayada" }, { "field3" : "yadabla" } ];

service3.ts: - 不导出APIS变量。

我想在oder中使用gulp创建一个看起来像这样的json文件:

[ { "field1" : "blabla" }, { "field2" : "yadayada" }, { "field3" : "yadabla" } ]

gulpfile.js - ???是丢失代码的占位符。

gulp.task('default', function () {
    return gulp.src('.../services/*.ts')
            .pipe(???)
            .pipe(concat('export.json'))
            .pipe(gulp.dest('./test'));
});

我对这两种打字稿都很陌生。 gulp,所以我不确定如何实现这个......任何想法? :)

编辑:所以,我知道没有针对此的OOTB解决方案,我需要编写自己的任务/插件。不过,我并不确定如何实现这一目标。 理想情况下,我想要的是找到一个gulp插件(或插件的组合),可以将ts / js文件作为具有属性的对象来处理。然后我可以从文件中提取我需要的var。

我无法真正找到类似的东西,只有字符串操作插件 - 将我的ts文件作为字符串处理并使用正则表达式搜索似乎对我来说过于复杂。我有什么东西在这里失踪吗?是否有更直接的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

打字稿compiler API在这里是相关的,因为这是您正确解析和理解ts代码所需要的。不幸的是,我认为没有一个gulp插件可以实现这个API。

我认为你最好的选择是在这里完全改变策略并以另一种方式解决你的问题,或者使用正则表达式尝试提取你想要的常量。除非你想使用编译器API编写自己的gulp-plugin。

答案 1 :(得分:0)

这就是我最终做的事情,它对我有用。我在这里定位它,以防其他人发现它有用。 :)

而不是.ts,我将导出保存在.js文件中,即:

service2.export.js:

exports.APIS = [ { "field2" : "yadayada" }, { "field3" : "yadabla" } ];

根据这里给出的答案:https://stackoverflow.com/a/36869651/3007732我创建了一个gulp任务如下:

var gulp = require('gulp');
var concat = require('gulp-concat');
var map = require('gulp-map');
var fs = require('fs');

var allServices;

gulp.task('default', function() {

    var allServices = [];

    var stream = gulp.src('./**/*.export.js')
        .pipe(map(function(file) {
            var obj = require(file.path);
            if (obj.APIS != null) {
                allServices.push.apply(allServices, obj.APIS);
            }
            return file;
        }));

    stream.on("end", function (cb)
    {   
        fs.writeFile('./export.json', JSON.stringify(allServices), cb);
    });

    return stream;
});

现在我在export.json中得到以下输出:

[ { "field1" : "blabla" }, { "field2" : "yadayada" }, { "field3" : "yadabla" } ]

这正是我想要的。