【问题标题】:How Should I Package or Declare Javascript Dependencies In An Open Source Application? [closed]我应该如何在开源应用程序中打包或声明 Javascript 依赖项? [关闭]
【发布时间】:2013-03-19 12:51:46
【问题描述】:

我有一个 Web 应用程序,包括前端和后端代码,我想将其推送到 github,但是,它目前有一些依赖项管理它的源代码树。后端代码是 Perl,从 CPAN 安装模块依赖项很好理解,所以我没有那些。我主要有 jQuery 库和其他一些开源的 Javascript 库。

-mycode
-mydir
   -mycode
   -jquerylibs (with their license)
   -mycode
   -jslibs     (with their own licenses)
-mycode

对于部署,这非常方便,因为我可以控制正在使用哪些版本的库,也不会强迫人们使用 CDN(内容交付网络)从远程域加载 jQuery 等,这可能不会三五年后还能上网。

但是,我不确定在我的应用程序中包含其他项目的源代码是否合适,即使我包含了许可文件。

在开源 Web 应用程序中包含此类依赖项的最佳方式是什么,在尊重依赖项的同时保持工作部署的便利性?

【问题讨论】:

  • 如果你想要解决这个问题,Git 子模块似乎是要走的路,但实际上,我不会太担心它,并运行你的设置。
  • thanks... git submodules 听起来与 svn:externals 完全一样,我在某些项目中确实使用过,当存在将上游提交给其他项目的可能性时。但我认为在这种情况下,我只想依赖标记版本,而不是指向外部存储库。

标签: jquery perl github open-source


【解决方案1】:

您是否考虑过为您的 JS 依赖项使用像 Bower 这样的包管理?这种前端东西的包管理变得越来越流行,并且类似于后端模块(CPAN、gems、pip 等)

【讨论】:

    【解决方案2】:

    没有什么会永远存在 - 我认为您在这里试图回答的问题是如何进行设置,以便真相的来源能够持续依赖于它们的代码的生命周期。

    在你的树中包含源代码是完全合理的,如果它只是几件事并且你依赖于特定的版本。

    作为替代方案,既然您无论如何都要推送到 GitHub,也许您可​​以派生必要的先决条件,为您的应用程序适当地标记它们,然后将它们作为 Git 子模块包含在内。这样一来,它们将至少与主应用程序源代码的规范事实来源一样长。

    如果它们现在不在 GitHub 上,但是是开源的,仍然可以自己将它们添加到 GitHub,然后将这些新的 GitHub 存储库作为子模块添加到您的项目中。

    【讨论】:

      【解决方案3】:

      在您的项目中包含源代码是可以的,只要您遵守许可协议即可。不过这可能会让人分心。不熟悉 jQuery 或其他任何东西的人可能不会意识到它是第三方代码。他们可能会浪费时间深入研究它或其他东西,而没有意识到它与您的项目无关。

      无论您应该在自述文件中记录依赖关系(例如,README、INSTALL、DEPENDS 等)。可能是您当前使用 jQuery x.y.z,但其中可能存在影响您的软件的错误。所以你不能保证固定版本总是理想的。

      通常不是捆绑源代码(因为它不会改变并且几乎不需要跟踪),而是编写一个帮助程序 bash 或 Perl 程序来从网络获取依赖项。这样,有一个简单的按钮可能适用于那些不想做大量阅读或手动工作的人,但你不会因为其他项目的混乱而分散人们对你自己的代码的注意力,并且依赖项是不会被您的存储库不必要地跟踪。

      追加:

      如果可能,您还应该更愿意在树中将第三方软件与您自己的软件完全分开,以便清楚第三方软件从哪里开始以及您的软件在哪里(同样,这样人们就不会误认为它是您的软件,这可能导致您提出无意义的要求等)。

      * <root>/
      `-* README
      `-* extlib/  <-- third party stuff can be tucked away in here, for example
      | `-* <third_party_code>
      | `-* jquery-x.y.z/
      | | `-* ...
      | `-* other-x.y.z/
      |   `-* ...
      `-* include/
      `-* Makefile
      `-* src/
        `-* <your_code>
        `-* main.c
        `-* ...
      

      如果需要在部署时混合,则让构建系统复制或链接到适当的位置。

      【讨论】:

        【解决方案4】:

        我还会确定您的应用所需的许可证类型。出于开源的目的,有一些可以让下载者更改甚至更改许可证类型并用于它的用途。当然,还有 GPL 许可甚至 MIT 许可的变体。寻找适合您需求的那一款。

        【讨论】:

          【解决方案5】:

          我认为没有简单的“最佳”解决方案可以满足您的要求。我确实在各种项目中使用了许多不同的方法。他们都做得很好——重要的是你喜欢如何组织代码,所以你可以很容易地在更长的时间内维护它。这当然是一件相当私人的事情。

          我自己喜欢将 CDN 用于 jQuery - 它比(非常不可能的)风险具有更多优势,即 google-CDN 服务器停机时间超过 5 秒。即使这样,您也可以在代码中构建一个故障保存功能,以加载本地托管的 jQuery 框架,以防 CDN 无法访问,如下所示:

          <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
          <script>window.jQuery || document.write('<script src="js/lib/jquery-1.10.2.min.js"></script>')</script>
          

          关于代码组织: 我更喜欢按以下结构管理我的文件

          /app
            +- /js
            |   +- /src               <- my custom scripts go into "/js/src"
            |   |    +- general-ui.js <- I create/edit this file
            |   |                        Usually I only edit files in this directory
            |   +- general-ui.min.js  <- the minified version is automatically stored in "/js"
            |   |                        I never edit a file in here
            |   +- /lib               <- external libraries go in here.
            |       |                    NEVER edit a file inside the "/js/lib" folder!
            |       +- jquery-1.10.2.min.js   <- Always add version-number to the files in /js/lib
            +- /css
            |   +- /scss              <- my SCSS source files which compile into "/css/style.css"
            |   +- /lib               <- stuff like twitter bootstrap css. Never edit files in here
            |   +- /font              <- webfonts used by the css
            +- /inc                   <- my own PHP classes/modules/etc
            |   +- /lib               <- external PHP modules (again: never edit these files yourself)
            +- /img                   <- all images used by the application
            +- /web                   <- my own PHP/HTML files
            +- index.php              <- this will load the /inc/application.php class which handles the rest
            +- debug.php              <- same as index, but enables some debugging flags enabled
            +- config.php             <- config stuff (DB, etc)
          

          在我的方法中,我将始终在应用程序快照中包含所有外部文件(例如,包括 jquery 和其他库的版本号)——因为毕竟应用程序是为某个外部库构建、测试并依赖于某个外部库的;所以我想将这些库“硬链接”到代码,因为它们形成一个单元。

          所以我的建议是不要使用 git 子模块,而是拥有一个包含所有文件的单一存储库,您可以完全控制这些文件。但是使用 CDN 加载库(您可以准确控制要加载的版本,这使得这个解决方案非常好)。 新版本的 jQuery?首先在本地实现,测试一下,然后将新的jQuery文件添加到/js/lib文件夹中(不要覆盖旧的,而是添加一个具有唯一版本号的新文件)

          【讨论】:

            猜你喜欢
            • 2011-03-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-13
            • 1970-01-01
            • 2019-08-15
            • 2019-05-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多