无法访问互联网的 Meteor 应用程序的本地 NPM/Atmosphere 程序包存储库
Local NPM/Atmosphere package repositories for Meteor applications without internet access
我目前正在开发 Meteor 应用程序的分支 Rocket Chat。我需要在隔离网络上建立应用程序进行测试和开发,因此无法访问互联网。
我不能只是在连接的系统上 运行 获取它,然后将其批量复制到断开连接的实验室中。相反,我需要能够检查源代码的副本(来自本地 SCM),然后 运行 Meteor,让它即时执行所有必要的编译和依赖项解析。
尽管这是一个巨大的混乱,但我希望我可以将 .meteor 文件夹从工作系统直接复制到目标系统上,这样它就已经有了所有必需包的缓存,因此不需要访问任何存储库。但是,根据我的发现,这仅适用于从 Atmosphere 下载的 Meteor 依赖项。
在 Rocket Chat 中,有几个私有包(例如 rocketchat-ldap)依赖于 NPM 包(在本例中,ldapjs).当应用程序为 运行 并构建这些包时,用户主目录中的 .npm 文件夹将填充这些 NPM 包。因此,我尝试将该文件夹与 .meteor 文件夹一起打包以完成相同的任务。
不幸的是,当我在离线系统上测试它时,尽管填充了 .npm 文件夹,Meteor 还是吐出以下错误:
While building package rocketchat:ldap:
error: Can't install npm dependencies. Are you connected to the internet?
显然,我没有连接 - 设计使然。
因此,我目前正在研究 Sinopia,以便在我们的本地网络上建立一个 NPM 存储库镜像,以托管这些依赖项。但是,我不知道应该如何将 Meteor 指向备用服务器。 Meteor 文档包含有关应用程序使用的 Npm.depends 和 Npm.requires 指令的信息,但我不能查找有关指定 URL 从中查找所述包的任何信息。
此外,是否可以对 Atmosphere 包做类似的事情?还是复制 .meteor 文件夹是唯一的方法?比如,是否有一些应用程序可以用来托管一些 Meteor 包?还是我用错了方法?
我采用的解决方案并不像我希望的那样优雅:
首先,我从 "working" 系统的用户帐户复制了 .meteor
文件夹(其中包含 Meteor 可执行文件和所有 Meteor 从 Atmosphere) 下载的软件包到断开连接的目标系统的用户帐户。这允许目标系统运行流星。
其次,有问题的 NPM 包被直接下载到源中的私有包中,但是源上的 .gitignore
文件被设置为忽略node_modules
个文件夹。所以我改变了它,然后将那些 node_modules
文件夹与应用程序的其余部分一起检查到源中。
因此,例如,应用程序源包含一个 /packages/rocketchat-ldap/.npm/package
文件夹。然后,当应用程序 运行 使用 meteor
时,相关的 NPM 包(例如 ldapjs)将被下载直接进入该文件夹结构中的 node_modules
文件夹,此时可以构建私有包。
现在,Git 中的源代码已经包含那些下载的包,因此当副本检出到断开连接的目标系统时,无需下载它们。
幸运的是,这并没有使源的大小增加太多(只有几百千字节)。
结果是,当运行将meteor
到运行目标系统上的应用程序时,所有依赖项都已经到位,不需要互联网连接。
我目前正在开发 Meteor 应用程序的分支 Rocket Chat。我需要在隔离网络上建立应用程序进行测试和开发,因此无法访问互联网。
我不能只是在连接的系统上 运行 获取它,然后将其批量复制到断开连接的实验室中。相反,我需要能够检查源代码的副本(来自本地 SCM),然后 运行 Meteor,让它即时执行所有必要的编译和依赖项解析。
尽管这是一个巨大的混乱,但我希望我可以将 .meteor 文件夹从工作系统直接复制到目标系统上,这样它就已经有了所有必需包的缓存,因此不需要访问任何存储库。但是,根据我的发现,这仅适用于从 Atmosphere 下载的 Meteor 依赖项。
在 Rocket Chat 中,有几个私有包(例如 rocketchat-ldap)依赖于 NPM 包(在本例中,ldapjs).当应用程序为 运行 并构建这些包时,用户主目录中的 .npm 文件夹将填充这些 NPM 包。因此,我尝试将该文件夹与 .meteor 文件夹一起打包以完成相同的任务。
不幸的是,当我在离线系统上测试它时,尽管填充了 .npm 文件夹,Meteor 还是吐出以下错误:
While building package rocketchat:ldap: error: Can't install npm dependencies. Are you connected to the internet?
显然,我没有连接 - 设计使然。
因此,我目前正在研究 Sinopia,以便在我们的本地网络上建立一个 NPM 存储库镜像,以托管这些依赖项。但是,我不知道应该如何将 Meteor 指向备用服务器。 Meteor 文档包含有关应用程序使用的 Npm.depends 和 Npm.requires 指令的信息,但我不能查找有关指定 URL 从中查找所述包的任何信息。
此外,是否可以对 Atmosphere 包做类似的事情?还是复制 .meteor 文件夹是唯一的方法?比如,是否有一些应用程序可以用来托管一些 Meteor 包?还是我用错了方法?
我采用的解决方案并不像我希望的那样优雅:
首先,我从 "working" 系统的用户帐户复制了 .meteor
文件夹(其中包含 Meteor 可执行文件和所有 Meteor 从 Atmosphere) 下载的软件包到断开连接的目标系统的用户帐户。这允许目标系统运行流星。
其次,有问题的 NPM 包被直接下载到源中的私有包中,但是源上的 .gitignore
文件被设置为忽略node_modules
个文件夹。所以我改变了它,然后将那些 node_modules
文件夹与应用程序的其余部分一起检查到源中。
因此,例如,应用程序源包含一个 /packages/rocketchat-ldap/.npm/package
文件夹。然后,当应用程序 运行 使用 meteor
时,相关的 NPM 包(例如 ldapjs)将被下载直接进入该文件夹结构中的 node_modules
文件夹,此时可以构建私有包。
现在,Git 中的源代码已经包含那些下载的包,因此当副本检出到断开连接的目标系统时,无需下载它们。
幸运的是,这并没有使源的大小增加太多(只有几百千字节)。
结果是,当运行将meteor
到运行目标系统上的应用程序时,所有依赖项都已经到位,不需要互联网连接。