首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提取使用的JS库的licenses

如何提取使用的JS库的licenses
EN

Stack Overflow用户
提问于 2014-07-18 20:58:35
回答 4查看 2.5K关注 0票数 4

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

EN

回答 4

Stack Overflow用户

发布于 2014-07-25 11:06:29

通常,许可证是JS文件中的第一个注释。例如(来自jQuery-1.11.1 uncompressed):

代码语言:javascript
复制
 /*!
 * 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

代码语言:javascript
复制
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 )。

票数 4
EN

Stack Overflow用户

发布于 2014-07-27 20:20:19

首先,我建议您使用bower.js来管理客户端javascript依赖项。它非常有用,对安装或更新您的javascript库等许多事情都有帮助。

如果这样做,您可以安装npmbower-license。它会为项目及其许可证生成一个bower依赖项列表。可以使用以下命令安装它

代码语言:javascript
复制
<<sudo>> npm install -g bower-license

请注意,您必须将node.jsnpm配合使用,而sudo取决于您使用的平台

输出如下所示:

代码语言:javascript
复制
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

您也可以使用包作为库:

代码语言:javascript
复制
var license = require('bower-license');
license.init('/path/to/package', function(licenseMap){
    console.log(licenseMap);
});
票数 2
EN

Stack Overflow用户

发布于 2014-07-21 22:22:47

因为Javascript没有固定的文件格式,或者它的头文件,你想要的在通用应用中(实际上)是不可能的。当然,您也可以手动尝试相同的操作。

在*nix机器(包括Mac)上,您可以使用非常强大的find命令,该命令允许您扫描特定文件并对其执行操作。例如:

代码语言:javascript
复制
find -name "*.js" -exec head {} \;

这将在目录树中查找所有JS文件,并对它们运行head命令,该命令默认转储文件的前10行。这通常会显示足够多的许可证信息。

现在,要找出实际包含了哪些JS文件,您可以使用带有递归标志的wget。这也绕过了常见的CMS问题,因为它检索的是浏览器看到的站点,而不是内部组织的站点。您可以使用以下命令将站点镜像到本地文件夹:

代码语言:javascript
复制
wget -r http://www.mydomain.tld/

不要在Stack Overflow上这样做,你会炸毁你的机器。但在一个规模合理的站点上,将这两个命令组合在一起是最接近于您的预期结果的,而无需编写数百行代码。使用system(...),您也可以在PHP中执行这两个命令,如果需要,您可以在*nix服务器上远程执行它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24825630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档