如何提取使用的JS库的许可证

时间:2014-07-18 12:58:35

标签: javascript

我想列出我在webapp中使用过的JS库。我可以以某种方式从包含的文件中自动提取它吗?我包含在头标中的那些?我可以以某种方式扫描特定的JS文件以获取许可证吗?

4 个答案:

答案 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库等许多内容。

如果这样做,您可以安装npmbower-license。它生成项目及其许可证的凉亭依赖关系列表。您可以使用

进行安装
<<sudo>> npm install -g bower-license

请注意,您必须node.js npmsudo取决于您使用的平台

输出如下:

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文件,如下所示:enter image description here