Автоматически конвертировать scala импорт предложений в зависимости библиотеки - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в Scala:)

Если я правильно понимаю, вы должны сначала включить необходимые библиотеки в Зависимости библиотек build.sbt файл, прежде чем вы сможете импортировать необходимые библиотеки в сценарий scala.

Однако я должен сделать это наоборот. Мне нужно написать скрипт Python для автоматического преобразования Scala предложений импорта в предложения зависимостей библиотеки, чтобы вставить их в build.sbt файл.

Например,

От:

import org.apache.spark.sql.SparkSession
import json._

до:

libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided"
libraryDependencies += "com.mediamath" %%% "scala-json" % "1.0"


Я знаю, что синтаксис библиотечных зависимостей выглядит следующим образом:

libraryDependencies += groupID % artifactID % revision % configuration

И что мы должны искать groupID, artifactID и revision в центральном репозитории maven .

Однако этот поиск manuel не позволяет мне автоматически программировать преобразование. Есть что-то, что я пропустил? Другой синтаксис, который я могу использовать для выполнения sh этой задачи? Есть еще способы?

1 Ответ

0 голосов
/ 17 апреля 2020

Так что в некоторых языках импорт должен выполняться определенным образом. Этот способ выглядит как «импортировать все вещи, а затем начать делать вещи»

В Scala можно импортировать элементы в любом месте исходного кода. Это усложнит вещи. Например, в коде Spark вы косвенно спрашиваете мастера приложения Spark, какие символы оно предлагает, которое хранится в переменной, переданной вам во время выполнения, и импортируете их.

import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark SQL basic example")
  .config("spark.some.config.option", "some-value")
  .getOrCreate()

// For implicit conversions like converting RDDs to DataFrames
import spark.implicits._

(Обратите внимание на Последняя строка в примере импортирует все, что содержится в поле implicits созданной искровой переменной.

Наконец, существует более одной версии артефакта Maven. Невозможно безопасно ссылаться на любую версию спецификаций * 1050. * Артефакт Maven, поскольку не все проекты пытаются обеспечить обратную совместимость между всеми номерами версий (и даже если они пытаются это сделать, ошибки в совместимости все еще могут существовать).

https://mvnrepository.com/artifact/org.apache.spark/spark-core перечисляет около 30 различных версий spark-core, основных подпрограмм, используемых другими библиотеками spark.Если вы выберете версию, отличающуюся от существующих служб spark, ваше приложение будет работать неправильно, так как spark обычно не совместим с основным номером версии, но по мажорному и минорному номеру версии (2.3 скомпилированный код не удастся для работы в среде 2.4)

Кроме того, код Scala использует сложные подпрограммы оптимизации на этапе компиляции. Эти процедуры оптимизации означают, что обычно нельзя использовать класс Scala 2.11 в среде выполнения Scala 2.12. Все классы должны точно соответствовать их среде выполнения. Чтобы обнаружить среду выполнения, не нужно проверять операторы импорта, а вместо этого проверять параметры среды выполнения Scala на компьютере, где происходит компиляция, и проверять, совпадают ли они с целевыми средами, в которых будут выполняться выходные данные. Вот почему для многих библиотек вы увидите один и тот же номер версии, созданный несколько раз, например

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>2.4.5</version>
</dependency>

против

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.4.5</version>
</dependency>

(Пример выше изготовлен, но иллюстрирует то же самое версия библиотеки, скомпилированная для 2.11 и 2.12)

Наконец, импорт не является ссылками на имена артефактов Maven. Скорее они являются элементами в файлах JAR (которые являются одним из видов артефактов Maven). Таким образом, у вас возникнет дополнительная проблема с определением того, какой JAR-файл содержит импортированные элементы, без возможности заранее узнать, какие JAR-файлы вы используете.

Короче говоря, вы пытаетесь изменить естественный процесс написания программ в этой среде с помощью рутины, потому что вы пытаетесь исправить программиста, который не задокументировал то, что они намеревались использовать. Тем не менее, ваша процедура должна будет

  1. взять импорт, некоторые из которых, возможно, построены во время выполнения, и составить список.
  2. взять этот список элементов и каким-то образом найти все файлы JAR, которые могут содержать элементы.
  3. Для каждого импортированного элемента, предлагаемого различными артефактами, определите (без ввода), какой из артефактов был тем, который разработчик намеревался использовать.
  4. Для проекта найдите нужную версию Scala (определенную средой (ами) развертывания) и найдите версии, соответствующие артефакту Scala.
  5. Список версий для этого артефакта найдите версию, которая будет работать с остальной инфраструктурой искры.

Для шагов 3 и 5 требуется решение, аналогичное «Я припарковал свой автомобиль, вот ключи, go найди его», где машина может быть где угодно в мире, и вы не можете получить больше информации от человека, чем «Я припарковал свою машину»

Шаг 4 требует обнаружения чего-либо это не может быть определено, потому что вы, вероятно, не знаете все места развертывания, но вы можете просто скомпилировать для каждой версии Scala.

Суть этого поста в том, что вы находитесь на поручение дурака Файл sbt - это документация того, что требуется / нужно разработчикам. Разработчик, который не может быть обеспокоен тем, чтобы написать единственную строку конфигурации на том, что они используют, является кошмаром. Разработчик, который забыл написать эту единственную строку, - это раздражение, которое можно легко исправить, попросив разработчика сделать то, что он забыл сделать.

И это игнорирует основные концепции Maven, на которых построен SBT. Поскольку при условии, что вам действительно удалось успешно выполнить шаги с 1 по 5, не все комбинации версий библиотеки работают вместе, поскольку Maven и SBT оба автоматически автоматизируют c разрешение зависимостей. Это означает, что если вы импортируете org: item: 1.1 и org: item2: 1.0, для org: item2: 1.0 может потребоваться org: item: 1.3, и у вас будет конфликт номера версии в ваших полностью разрешенных зависимостях Maven. При таких условиях только одна из библиотек используется в проектах Java 1.8, и если используемая библиотека имеет несовместимость с некоторым кодом, люди (называемые мастерами сборки) обычно должны исследовать конфигурацию сборки и определить, какие версии какие артефакты нужно обновить, чтобы исправить несовместимости.

Если бы ваш проект мог быть написан, это было бы здорово. Удачи!

...