为 Bluemix 上运行的 Node.js 应用程序自动收集法律报告(3)
- UID
- 1066743
|
为 Bluemix 上运行的 Node.js 应用程序自动收集法律报告(3)
第 4 步. 收集客户端依赖项(Bower 组件)Bower 是一个工具,使用它可以轻松地管理客户端依赖项。无需访问您想要使用的每个项目的站点并下载必要的库文件,您可创建一个 Bower 配置文件,自动完成此流程。
如果环境中没有 Bower,可按照这篇 中的步骤设置它。
为您的项目安装并配置 Bower 后,所有客户端依赖项都存储在一个名为 bower.json 的文件中。确保项目中使用的所有客户端依赖项都是通过 Bower 添加的,而不是直接添加到页面中,这样所生成的报告才是准确无误的。
- 要收集 Bower 依赖项,可将 bower-license Node 模块添加到项目中。从项目的根目录中运行以下命令:
1
| npm install bower-license --save-dev
|
- 安装该插件后,在您的 license.js 文件中应使用以下 JavaScript 代码启用该插件:
1
| var license = require('bower-license');
|
- 加载此模块后,开始编码将使用 bower-license 的自定义任务。创建一个名为 run_bower_license 的任务来收集所有依赖项并将结果输出到一个文件中。将以下代码添加到 licenses.js 文件中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| var license = require('bower-license'),
fs = require('fs');
module.exports = function (grunt) {
'use strict';
grunt.registerMultiTask('run_bower_license', 'Gather bower license report', function () {
var options = this.options({
directory: 'bower_components',
output: 'bower-license.csv'
}),
entry, item, prop, done, dependency;
done = this.async();
console.log('Executing run_bower_license task');
// If output file already exists, will delete it
if(grunt.file.exists(options.output)) {
console.log('Output file already exists. Will delete it');
grunt.file.delete(options.output);
}
license.init(options, function (data) {
for (entry in data) {
item = {
licenses: "",
repository: "",
homepage: ""
};
for (prop in data[entry]) {
if (prop === 'licenses') {
item.licenses = data[entry][prop];
} else if (prop === 'repository') {
item.repository = data[entry][prop];
if (item.repository.constructor === Object) {
item.repository = item.repository.url;
}
} else if (prop === 'homepage') {
item.homepage = data[entry][prop];
}
}
item.version = entry.substring(entry.indexOf('@') + 1, entry.length);
item.name = entry.substring(0, entry.indexOf('@'));
dependency = item.name + ',' + item.version + ',' + item.repository + ',' + item.licenses;
if(item.homepage) {
dependency += ',' + item.homepage;
}
fs.appendFileSync(options.output, dependency + '\r\n');
}
console.log('End of run_bower_license task');
done();
});
});
};
|
此代码注册一个名为 run_bower_license 的 Grunt 任务,该任务接受两个参数—一个表示 Bower 组件存储在何处的目录,一个表示所生成的输出文件的名称。它删除输出文件(如果已存在)并调用 bower-license 库,该库从 Bower 读取所有客户端依赖项。
对于返回的每个依赖项,run_bower_license 尝试获得库的名称、版本、git 存储库 URL、许可和主页。对于一个给定的库,可能并非所有这些信息都有,但所拥有的信息都会放在输出文件中。
- 在 Gruntfile.js 文件中,注册一个调用 run_bower_license 任务的新目标任务。将它命名为 client-side-license。
1
| grunt.registerTask('client-side-license', ['run_bower_license:all']);
|
- 从 Grunt 命令行运行 client-side-license 任务。
1
| grunt client-side-license
|
输出应该如下所示:
1
2
3
4
5
6
| Running "run_bower_license:all" (run_bower_license) task
Executing run_bower_license task
Output file already exists. Will delete it
End of run_bower_license task
Done, without errors.
|
- 创建一个名为 get-licenses 的任务,该任务同时调用客户端和服务器端版本。
1
| grunt.registerTask('client-side-license', ['run_bower_license:all']);
|
- 执行所有这些更改后,您的 Gruntfile.js 文件应该类似于:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
license_finder: {
dev: {
options: {
production: false,
out: 'npm-dev-licenses.csv',
csv: true
}
},
prod: {
options: {
production: true,
out: 'npm-prod-licenses.csv',
csv: true
}
}
},
run_bower_license: {
all: {
options: {
directory: 'bower_components',
output: 'bower-license.csv'
}
}
}
});
grunt.task.loadTasks('build_tasks');
grunt.loadNpmTasks('grunt-license-finder');
grunt.registerTask('server-side-license', ['license_finder:dev', 'license_finder:prod']);
grunt.registerTask('client-side-license', ['run_bower_license:all']);
grunt.registerTask('get-licenses', ['server-side-license', 'client-side-license']);
};
|
- 从 Grunt 命令行运行 get-licenses 任务,获得客户端和服务器端报告。
输出应该如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Running "license_finder:dev" (license_finder) task
Retrieved license information
License information written to: npm-dev-licenses.csv
Running "license_finder:prod" (license_finder) task
Retrieved license information
License information written to: npm-prod-licenses.csv
Running "run_bower_license:all" (run_bower_license) task
Executing run_bower_license task
Output file already exists. Will delete it
End of run_bower_license task
Done, without errors.
|
|
|
|
|
|
|