我正在编写一个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。我在下面的答案中详细介绍了该过程。
答案 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