2013-03-19 27 views
9

我有一个web应用程序,包括前端和后端代码,我想推送给github,但是,它目前有一些依赖关系管理它的源代码树。后端代码是Perl,并且从CPAN安装模块依赖关系很好理解,所以我没有那些内容。我主要有jQuery库和其他一些开源的Javascript库。如何在开源应用程序中打包或声明Javascript依赖关系?

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

对于部署,这是非常方便的,因为我可以控制正在使用该库的版本,也不能强迫人们使用CDN(内容分发网络),以从远程加载的jQuery等。域名可能在三年或五年内仍未上线。

不过,我不知道这是否是合适的,包括其他项目的来源与我的应用程序,即使我包括许可文件。

什么是包括这样依赖于一个开源的Web应用程序,同时保持工作部署的方便了依赖做荣誉的最好方法是什么?

+1

如果你想* *,以解决这个问题,Git的子模块似乎是要走的路,但实际上,我不会太担心它,并且使用你所拥有的设置来运行。 – Matt 2013-03-19 13:05:43

+0

谢谢... git子模块的声音完全像svn:外部的,我在某些项目中使用的时候,可能会向上游提交这些其他项目。但我认为在这种情况下,我只想依靠标签版本,而不是指向外部存储库。 – Marcus 2013-03-19 13:18:49

回答

0

没有什么会永远在你身旁 - 我想你想在这里回答的问题是如何设置的东西,使真理的来源将持续进行依赖于它们的代码的寿命。

如果只包含一些东西,而且依赖于特定版本,那么将源代码包含在树中是非常合理的。

作为替代方案,因为你推到GitHub上,无论如何,也许你可以派生必要的先决条件,适当地标记它们为你的应用程序,然后把它们作为Git的子模块。那样的话,它们至少与主应用程序源代码的真实源代码一样长。

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

0

只要您遵守许可证,在项目中包括源代码就没有问题。但它可能会让人分心。有人不熟悉jQuery或其他任何可能没有意识到它是第三方代码。他们可能会浪费时间来挖掘它或者其他东西,而不会意识到它与你的项目无关。

无论你应该文档中的自述文件的依赖关系(例如,README,INSTALL依赖,等等)。可能是因为您目前使用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 
    `-* ... 

如果需要在部署共同混合,然后有构建系统复制或链接东西放到合适的地方。

0

我也确定你需要的应用程序的许可证类型。有一些开源的目的可以让下载者改变甚至改变许可证的类型并用于它。当然还有GPL许可证甚至MIT许可证的变体。寻找适合您需求的产品。

0

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

我自己喜欢用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和其他库的版本号) - 因为毕竟该应用程序是专为与测试,并依赖在某个外部图书馆;所以我想在构建单个单元时将这些库“硬连接”到代码中。

所以我的建议是不要使用git的子模块,而是有一个信息库,其中包括所有的文件,你是完全的控制权。但是使用CDN来加载库(你可以精确地控制加载哪个版本,这使得这个解决方案非常好)。 新版本的jQuery?首先实现在本地,对其进行测试,然后添加新的jQuery文件到/ JS/lib文件夹(不覆盖旧的,但添加具有唯一版本号的新文件)

1

你有没有考虑使用包管理像你的JS依赖关系的Bower?该前端的东西包管理正变得越来越流行,类似后端模块(CPAN,宝石,画中画等)

相关问题