能同步文件的Node.js FTP模块?

4

我在寻找一个适用于Node.js的模块,最好可以通过npm获取,用于与FTP服务器同步文件。虽然ftp模块具有所有基本功能,但在其基础上编写完整的同步系统似乎需要很多工作。


哪个FTP模块?您还需要支持其他协议,如SCP和SFTP吗? - jsalonen
实际上,我需要普通的FTP。我正在与的服务器不支持其他任何协议。 - mzedeler
是的,这确实需要很多工作... - Evan Plaice
3个回答

7
我是jsftp的作者。通过jsftp,只需简单地遍历要上传的目录即可轻松同步。Jsftp可以处理并行被动请求(在内部它们仍然是顺序的,但您不必担心它),因此您只需要使用顺序的ftp.put调用,就可以在不需要太多脚本编写的情况下工作。
更好的做法是在node中使用尚未记录文档的ftp.getPutSocket方法,它允许您获取原始的PASV套接字,并将其推入其中(例如使用流)。对于这种情况的特定示例,您可以查看vfs-ftp的实现方式。
如果您需要更多有关实现同步的帮助,请随时与我联系。

谢谢你的提示。如果我遇到困难,我会告诉你的。 - mzedeler
1
+1 了不起的库。它已被证明非常有用和强大。如果你想看到它的实际效果,请查看node-ftpsync。推送支持几乎完成,我只需要完成基于MDTM的时间戳比较部分即可。 - Evan Plaice
谢谢@EvanPlaice,听到这样的话很高兴。如果您在其中漏掉了什么或想到任何改进,请告诉我! - Sergi Mansilla
我的一位同事决定重新发明整个东西,使用非常简单的方法,只使用本地状态文件进行单向同步。它可以在这里找到:https://npmjs.org/package/ftpkick - mzedeler
@GiantSquid 我怎样才能确定连接已经成功建立? - Manwal
显示剩余2条评论

2

看一下 node-ftpsyncgrunt-ftpsync

它利用Sergi的jsftp库智能同步文件到远程服务器。

注意:当前,除了基于时间戳的更新比较外,推送支持所需的所有内容均已实现。目前,更新是仅通过比较文件大小来确定的。

node-ftpsync 提供CLI支持和编程API。首选解决方案是全局安装并在包含config.json的目录中运行它。或者,它也可以作为一个lib轻松配置、扩展和在代码中启动。

grunt-ftpsync 的工作方式与之相同,只是配置和运行应用程序是通过grunt完成的。它甚至可以输出花哨的彩色日志。

免责声明:我是node-ftpsync和grunt-ftpsync的作者


时间戳支持为何未被实现?grunt-ftpsync是否已经实现了它? - wayofthefuture
1
@Dude2TheN,grunt-ftpsync只是node-ftpsync的友好包装。由于FTP协议在执行时间比较时支持较弱或几乎不支持时间戳,因此尚不存在时间戳支持。我还没有找到可行的非hacky解决方案来解决这个问题。 - Evan Plaice

2

我在npm、github和互联网上进行了一些调研,并没有找到任何看起来不错的同步方案。

我会首先写一个(简单)的同步库,使用一些好的ftp库。就个人而言,我认为jsftp最具吸引力(http://sergi.github.com/jsftp/)。只需将jsftp与一些文件系统遍历结合使用--特别是如果你只需要简单的单向同步,这应该是不难做到的。

实现单向同步(从本地文件系统到ftp)的一些想法:

  • 打开到ftp服务器的连接
  • 使用fs.readdir遍历本地文件系统
  • 获取相应ftp文件的状态,如果本地版本较新则上传(如果使用jsftp,使用和)

另外,问问自己是否真的需要使用node.js执行同步?例如,如果您可以在系统中运行Python脚本,则可以简单地使用一个具有FTP支持的双向同步工具ftpsync2d(http://code.google.com/p/ftpsync2d/)。


1
谢谢您的建议。我实际上一开始就采用了“我会随便写点什么”的方法,但后来决定放弃,因为它变得有点太复杂了。我想在node中完成这个任务是为了使其跨平台 - 这是一个Cakefile(coffeescript Makefile),用于部署到本地测试服务器。开发人员使用Windows、Linux和Mac。 - mzedeler
谢谢您的跟进。如果您正在使用ftp进行node应用程序部署,那么您是否可以直接从git存储库进行部署呢?此外,如果您具有shell访问权限,您可以使用一些自动化部署工具,例如deploy(https://github.com/visionmedia/deploy)。 - jsalonen
谢谢您的建议 - 不幸的是,我所在的环境被防火墙保护,大多数通常的事情在我们的系统管理员看来都是不寻常的。我部署到的服务器是一台Windows机器,我们只有ftp访问权限。 - mzedeler
1
+1 好答案。使用已经建立的 Python 项目确实很吸引人,但是一个好的 Node 实现也可以与 Grunt 集成,并用作一键部署解决方案。有几个选项可用,例如 grunt-ftpdeploy,但它们都会推送所有内容。我创建了 node-ftpsync 和 grunt-ftpsync 插件,因为它可以智能地比较本地和远程树,仅同步已更改的文件。 - Evan Plaice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接