我想列出我在webapp中使用过的JS库。我可以以某种方式从包含的文件中自动提取它吗?在我的head标签中包含的那些?我能以某种方式扫描特定的JS文件中的许可证吗?
发布于 2014-07-25 11:06:29
通常,许可证是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中工作,或者你可以很容易地将它移植到其他语言(特别是带有JS ScriptEngine的java )。
发布于 2014-07-27 20:20:19
首先,我建议您使用bower.js来管理客户端javascript依赖项。它非常有用,对安装或更新您的javascript库等许多事情都有帮助。
如果这样做,您可以安装npm包bower-license。它会为项目及其许可证生成一个bower依赖项列表。可以使用以下命令安装它
<<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);
});发布于 2014-07-21 22:22:47
因为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服务器上远程执行它们。
https://stackoverflow.com/questions/24825630
复制相似问题