9

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

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

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

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

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

4

5 回答 5

1

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

于 2013-08-13T20:49:24.000 回答
0

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

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

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

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

于 2013-03-19T18:52:09.773 回答
0

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

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

通常不是捆绑源代码(因为它不会改变并且几乎不需要跟踪),而是编写一个辅助 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
  `-* ...

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

于 2013-05-31T13:51:44.323 回答
0

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

我自己喜欢将 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文件夹中(不要覆盖旧的,而是添加一个具有唯一版本号的新文件)

于 2013-07-30T20:15:44.610 回答
0

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

于 2013-06-24T22:00:12.113 回答