我想列出我在webapp中使用过的JS库。我可以以某种方式从包含的文件中自动提取它吗?我包含在头标中的那些?我可以以某种方式扫描特定的JS文件以获取许可证吗?
答案 0 :(得分:3)
通常,许可证是JS文件中的第一个注释。例如(来自jQuery-1.11.1 uncompressed):
/*!
* jQuery JavaScript Library v1.11.1
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2014-05-01T17:42Z
*/
(function( global, factory ) {
if ( typeof module === "object" && typeof module.exports === "object" ) {
....
虽然没有标准化的标题,但您可以采取一些措施来确定它的许可证,尽管它们不适用于每个脚本。你可以看到一个有效的jsfiddle 2 [这里]。
var getLicense = function (text) {
var output = document.querySelector('#output');
var regex = new RegExp("/\\*[\\S\\s]*?\\*/","m");
var commentText = rexex.exec(text)[0];
//check for some common licenses.
if(commentText.toLowerCase().contains("apache license")||commentText.toLowerCase().contains("apache commons")) {
output.innerHTML += "License is: Apache";
return "Apache";
} else if(commentText.toUpperCase().contains("BSD")) {
output.innerHTML += "License is: BSD";//you might want to check for different versions
return "BSD";
} else if(commentText.toUpperCase().contains("LGPL")) {
output.innerHTML += "License is: LGPL";
return "LGPL";
} else if(commentText.toUpperCase().contains("GPL")) {
output.innerHTML += "License is: GPL";
return "GPL";
} else if(commentText.toLowerCase().contains("mozilla public")) {
output.innerHTML += "License is: Mozilla Public License";
return "Mozilla";
} else if(commentText.toLowerCase().contains("mit license")) {
output.innerHTML += "License is: MIT";
return "MIT";
}
//remove any dangling newlines or spaces before the beginning
text = text.trim();
//check if there is a 'header' comment
if(text.startsWith('/*')) {
var commentLines = commentText.split('\n');
console.log(commentLines);
//iterate through the comment lines, and pull out the important ones
for (var k in commentLines) {
var commentLine = commentLines[k];
console.log(commentLine);
if(commentLine.contains('license')) {
output.innerHTML+=commentLine+"\n";
}
}
return;
} else {
output.innerHTML+="No idea...\n";
}
};
它基本上搜索了一些常见的JS许可证(我假设你只是指开源许可证)。如果做不到这一点,它需要第一个多行注释,并打印出带有'license'字样的行,这有点有效。如果您知道脚本正在使用的许可证集,则可以使用查找功能来获取许可证文本。
这样可以很好地工作,但有些脚本不会有标题注释。这个脚本可以在node.js,标准javascript中使用,或者你可以很容易地将它移植到其他语言(特别是java,带有它的JS ScriptEngine
)。
答案 1 :(得分:2)
首先,我建议您使用bower.js来管理客户端javascript依赖项。它非常有用,可以帮助您安装或更新javascript库等许多内容。
如果这样做,您可以安装npm
包bower-license。它生成项目及其许可证的凉亭依赖关系列表。您可以使用
<<sudo>> npm install -g bower-license
请注意,您必须node.js
npm
而sudo
取决于您使用的平台
输出如下:
bower-license
├─ highlight
│ └─ licenses: UNKNOWN
├─ bootstrap-daterangepicker@1.2.0
│ └─ licenses: MIT*
├─ js-signals@1.0.0
│ ├─ licenses: MIT*
│ └─ homepage: http://millermedeiros.github.com/js-signals/
├─ moment@2.4.0
│ └─ licenses: MIT*
├─ highcharts.com@3.0.7
│ ├─ licenses: UNKNOWN
│ └─ homepage: https://github.com/highslide-software/highcharts.com
├─ hasher@1.1.3
│ ├─ licenses: MIT*
│ └─ homepage: https://github.com/millermedeiros/Hasher
您也可以将包用作库:
var license = require('bower-license');
license.init('/path/to/package', function(licenseMap){
console.log(licenseMap);
});
答案 2 :(得分:1)
因为Javascript或其标题没有固定的文件格式,所以在通用应用程序中(实际上)不可能。但是,您当然可以手动尝试相同的事情。
在* nix机器(包括Mac)上,您拥有非常强大的find
命令,该命令允许您扫描特定文件并对其执行操作。例如:
find -name "*.js" -exec head {} \;
这将在目录树中找到所有JS文件,并对它们运行head
命令,默认情况下会转储该文件的前10行。这通常应该显示出足够多的许可证信息。
现在要找出实际包含哪些JS文件,您可以将wget
与递归标志一起使用。这也绕过了常见的CMS问题,因为它会在浏览器看到它时检索网站,而不是内部组织的方式。您可以使用以下命令将站点镜像到本地文件夹:
wget -r http://www.mydomain.tld/
不要在Stack Overflow 上执行此操作,您将炸毁您的计算机。但是在一个合理大小的网站上,将这两个命令组合在一起是最接近您预期结果的,而无需编写数百行代码。使用system(...)
,你也可以在PHP中执行这两个命令,允许你在* nix服务器上远程执行它们。如果需要的话。
答案 3 :(得分:-1)
可以使用bower来管理客户端依赖项。有人想要审核安装了元信息的bower软件包以及可以使用的许可文件 “bower-license-tracker”模块。该模块将生成JSON文件,如下所示: