Невозможно использовать библиотеку NodeJS Twitter в проекте ClojureScript 1.8 Lein

Я разрабатываю проект ClojureScript на основе начального шаблона, созданного с помощью lein new cljs-lambda my-proj.

Project.clj выглядит так:

(defproject my-proj "0.1.0-SNAPSHOT"
  :description "Jim's bot"
  :url "http://jim.derp"
  :dependencies [[org.clojure/clojure       "1.8.0"]
                 [org.clojure/clojurescript "1.8.51"]
                 [org.clojure/core.async    "0.2.395"]
                 [io.nervous/cljs-lambda    "0.3.5"]
                 [cljs-http "0.1.44"]]
  :plugins [[lein-cljsbuild "1.1.4"]
            [lein-npm       "0.6.0"]
            [lein-doo       "0.1.7"]
            [io.nervous/lein-cljs-lambda "0.6.6"]]
  :npm {:dependencies [[source-map-support "0.4.0"]
                       [xhr2 "0.1.4"]
                       [twitter "1.7.1"]
                       ]}

  :source-paths ["src"]
  :cljs-lambda
  {:defaults      {:role "arn:aws:iam::954459734159:role/cljs-lambda-default"}
   :resource-dirs ["static"]
   :functions
   [{:name   "cljs-twitter-unfollower"
     :invoke twitter-unfollower.core/run-lambda}]}
  :cljsbuild
  {:builds [{:id "twitter-unfollower"
             :source-paths ["src"]
             :compiler {:output-to     "target/twitter-unfollower/twitter_unfollower.js"
                        :output-dir    "target/twitter-unfollower"
                        :source-map    true
                        :target        :nodejs
                        :language-in   :ecmascript5
                        :optimizations :none}}
            {:id "twitter-unfollower-test"
             :source-paths ["src" "test"]
             :compiler {:output-to     "target/twitter-unfollower-test/twitter_unfollower.js"
                        :output-dir    "target/twitter-unfollower-test"
                        :target        :nodejs
                        :language-in   :ecmascript5
                        :optimizations :none
                        :main          twitter-unfollower.test-runner
                        }
             }]})

```

В разделе :npm {:dependencies } я добавил [twitter "1.7.1"], чтобы подключить мою внешнюю библиотеку javascript, twitter, команда установки которой npm i twitter --save и последняя версия "1.7.1". Когда я запускаю lein deps, я действительно вижу, что мои библиотеки загружаются в папку node_modules. Ура! Моя проблема теперь использует это из моих файлов clojurescript...

На этот короткий и простой вопрос предположим, что в моем проекте есть только один файл clojurescript, core.cljs, и внутри него находится этот код:

(ns twitter-unfollower.core
  (:require [cljs-lambda.util :as lambda]
            [cljs-lambda.context :as ctx]
            [cljs-lambda.macros :refer-macros [deflambda]]
            [cljs-http.client :as http]
            [cljs.nodejs :as nodejs]
            [cljs.core.async :as async :refer [<!]])

(defn doStuff []
  (println "searching for tweets...")

  ;; fetch tweets here!

)

(deflambda run-lambda []
  (doStuff))

Когда я пытаюсь затем добавить твиттер, помещая `[twitter :as twitter] с другими вещами внутри формы :require, он выдает ошибку:

Compiling "target/twitter-unfollower/twitter_unfollower.js" from ["src"]...
Compiling "target/twitter-unfollower/twitter_unfollower.js" failed.
clojure.lang.ExceptionInfo: failed compiling file:src/twitter_unfollower/core.cljs {:file #object[java.io.File 0x1b641c97 "src/twitter_unfollower/core.cljs"]}
...
...
...
Caused by: clojure.lang.ExceptionInfo: No such namespace: twitter, could not locate twitter.cljs, twitter.cljc, or Closure namespace "twitter" in file src/twitter_unfollower/core.cljs {:tag :cljs/analysis-error}

Разве это не правильный способ добавления модулей nodejs в код cljs? Нужно ли мне, возможно, использовать версию require для nodejs, а не clojurescript? Спасибо!


person Jim    schedule 02.03.2018    source источник
comment
Попробуйте текущую версию Clojure и ClojureScript, 1.8 была давно…   -  person glts    schedule 02.03.2018
comment
Никогда не исправлял проблему с cljs 1.8, но я действительно решил проблему, используя lein Ancient для обновления до 1.10 cljs. Спасибо!   -  person Jim    schedule 05.03.2018
comment
@ Джим, как тебе удалось заставить это работать? вы используете встроенный clojurescript: npm-deps или вы используете lein-npm? Есть ли способ поделиться простым примером проекта?   -  person wildnux    schedule 08.03.2018
comment
@wildnux Я использую lein-npm. Вы можете проверить этот проект.   -  person Jim    schedule 08.03.2018
comment
@ Джим, спасибо, я наконец-то смог использовать собственный clojurescript: npm-deps в лейнингене без использования lein-npm   -  person wildnux    schedule 12.03.2018


Ответы (1)


Я не могу воспроизвести. Я добавил закрывающую скобку в форму ns для twitter-unfollower.core.

Я сначала побежал:

lein npm install

Затем:

$ lein cljsbuild once Compiling ClojureScript... Compiling "target/twitter-unfollower/twitter_unfollower.js" from ["src"]... Successfully compiled "target/twitter-unfollower/twitter_unfollower.js" in 5.871 seconds.

person Mike Fikes    schedule 02.03.2018
comment
Спасибо, но как вы можете получить доступ к библиотеке твиттера в коде cljs? В этом главный смысл этого вопроса. Вы используете ClojureScript 1.8.51? - person Jim; 02.03.2018
comment
@ Джим Я просто скопировал ваш исходный код project.clj и twitter-unfollower.core, исправил закрывающую скобку, а затем запустил lein npm install, а затем lein cljsbuild once и не смог воспроизвести ошибку компиляции. - person Mike Fikes; 02.03.2018
comment
В вопросе я упоминаю, что сборка работает для меня, пока я не попытаюсь получить доступ к пространству имен, запросив [twitter : as twitter]. Он по-прежнему компилируется для вас, когда вы пытаетесь добавить твиттер в один из файлов cljs? - person Jim; 03.03.2018
comment
О, извини, @jim, я пропустил этот аспект. Да, я могу воспроизвести вашу ошибку, если добавлю [twitter :as twitter] - person Mike Fikes; 03.03.2018