如何在开源应用程序中打包或声明Javascript依赖项?

时间:2013-03-19 12:51:46

标签: jquery perl github open-source

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

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

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

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

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

5 个答案:

答案 0 :(得分:1)

您是否考虑过使用像Bower这样的包管理来实现JS依赖?这种前端产品的包管理变得越来越流行,类似于后端模块(CPAN,宝石,点子等)

答案 1 :(得分:0)

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

如果只是一些事情并且您依赖于特定的版本,那么在您的树中包含源是完全合理的。

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

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

答案 2 :(得分:0)

只要您遵守许可证,在项目中包含来源就可以了。但它可能会分散注意力。有些人不熟悉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
  `-* ...

如果需要在部署中进行混合,那么让构建系统复制或将事物链接到适当的位置。

答案 3 :(得分:0)

我还要确保您为该应用程序所需的许可类型。有一些出于开源的目的,可以让下载者更改甚至更改许可证的类型并使用它。当然有GPL许可证甚至MIT许可证的变体。寻找适合您需求的那个。

答案 4 :(得分:0)

我认为没有简单的&#34;最好的&#34;满足您要求的解决方案我确实在各种项目中使用了许多不同的方法。所有这些都做得非常好 - 重要的是你喜欢组织代码的方式,这样你就可以在更长的时间内轻松维护代码。这当然是一件非常私人的事情。

我自己喜欢将CDN用于jQuery - 它比(非常不可能)的风险更有优势,谷歌CDN服务器的停机时间超过5秒。即使这样,您也可以在代码中构建一个失败保存来加载您的localy托管的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和其他库的版本号) - 因为毕竟应用程序是为某个外部库构建,测试并依赖于某个外部库;所以我想&#34;硬链接&#34;这个库代码组成一个单元。

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