Heroku上的Clojure + Clojurescript应用程序:部署应用程序时未安装npm软件包的依赖项

时间:2019-06-19 20:30:48

标签: heroku npm clojure clojurescript leiningen

我正在编写一个Web应用程序,其后端使用Clojure,而前端使用Clojurescript使用React和Reagent。我正在尝试将其托管在Heroku上。

当我在本地运行lein ubjerar时,它可以正常运行并且该应用可以正常工作。

但是,当我尝试通过git push heroku master将应用程序部署到Heroku时,总是会遇到这样的错误:

remote:        Preparing npm packages
remote:        Installing npm packages
remote:        npm packages successfully installed
remote:        Running shadow-cljs...
remote:        [:app] Compiling ...
remote:        The required JS dependency "object-assign" is not available, it was required by "node_modules/react/cjs/react.production.min.js".
remote:
remote:        Searched in:/tmp/build_c09494ebe081fa0581db343dc809fb45/node_modules
remote:
remote:        You probably need to run:
remote:          npm install object-assign
remote:
remote:        See: https://shadow-cljs.github.io/docs/UsersGuide.html#npm-install
remote:
remote:  !     Failed to build.
remote:  !     Push rejected, failed to compile Clojure (Leiningen 2) app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !   Push rejected to getfluentspanish.
remote:
To https://git.heroku.com/getfluentspanish.git
 ! [remote rejected] master -> master (pre-receive hook declined)

尽管object-assign被列为react npm软件包的依赖项,但还是发生了这种情况,我已经在我的{{1 }}。我已经验证了在本地构建时,该软件包可以很好地安装(即,在这种情况下,:npm-deps存在)。

当我手动将project.clj添加为node_modules/object-assign中的显式依赖项时,我遇到了相同的错误,但是抱怨缺少 的依赖项,这些依赖项应自动安装(并且本地)。当我添加 new 缺失依赖项时,它会抱怨另一个。当我在本地使用新的显式依赖项进行构建时,object-assign可以工作,但抱怨现在存在版本冲突,因为隐式依赖项通常固定在其他版本上。

有什么主意我可以解决这个问题吗?

编辑,这是我的:npm-deps

lein uberjar

编辑2 我最终放弃了project.clj部署方法,转而使用Docker。我在下面的答案中详细介绍了该过程。

3 个答案:

答案 0 :(得分:0)

您的项目是否基于某种框架(例如Luminus)?您可以发布project.clj文件吗?该信息将帮助其他人了解正在发生的事情。

根据项目配置,运行lein uberjar可能会做不同的事情。最常见的情况是使用Clojure后端,其中uberjar任务将Clojure和Java编译为字节码并将结果包装到JAR文件中。也可能有一些别名,这些别名添加了从NPM下载依赖项和将ClojureScript编译成也打包为JAR一部分的资产的步骤,但是如果不查看project.clj文件就很难分辨。 / p>

答案 1 :(得分:0)

我最终放弃了基于Git的Heroku部署,而是对其进行了重新设计以改为使用Docker。现在它可以工作了,但是唯一的缺点是,我现在每次要部署时都必须在本地构建一个新的Docker映像,这比git push heroku master和远程lein uberjar慢。我可以将此步骤移至CI服务器或以后的设备上,并通过Github挂钩进行构建和部署,从而为我提供了类似的便利。

实际上,使用Docker的简单性给我留下了深刻的印象。我使用的Dockerfile非常琐碎:

FROM openjdk:8-alpine
COPY target/uberjar/getfluentspanish.jar /getfluentspanish/app.jar
EXPOSE 3000
CMD ["java", "-jar", "/getfluentspanish/app.jar"]

我希望这对尝试使用完整的Clojure&Clojurescript应用程序部署到Heroku的人有所帮助。

答案 2 :(得分:0)

我有类似的问题。就我而言,在编译shadow-cljs之前,有问题的软件包已由heroku-buildpack进行了“修剪”。参见heroku document

我添加了以下env变量并解决了问题。

NPM_CONFIG_PRODUCTION=false
YARN_PRODUCTION=false