Este es el hogar de la biblioteca estándar, compilador y especificaciones de idioma Scala 2.
Para Scala 3, visite Scala/Scala3.
Los problemas y los informes de errores para Scala 2 se encuentran en Scala/Bug. Ese rastreador también es donde los nuevos contribuyentes pueden encontrar problemas en los que trabajar: buenos primeros problemas, ayuda para la ayuda.
Para la coordinación de esfuerzos más amplios, también utilizamos el rastreador Scala/Scala-Dev.
Para contribuir aquí, abra una solicitud de extracción de su bifurcación de este repositorio.
Tenga en cuenta que no podemos aceptar adiciones a la biblioteca estándar, solo modificaciones al código existente. La compatibilidad binaria prohíbe agregar nuevas clases públicas o métodos públicos. Las adiciones se realizan a Scala-Library-Next.
Requerimos que firme el Scala Cla antes de poder fusionar cualquiera de su trabajo, para proteger el futuro de Scala como software de código abierto.
El flujo de trabajo general es el siguiente.
Para obtener más información sobre cómo construir y desarrollar el núcleo de Scala, lea el resto de este readme, ¡especialmente para configurar su máquina!
Para ponerse en contacto con otros colaboradores de Scala, únase al canal #Scala-Contributors en el chat de discordia Scala, o publique en los contribuyentes.scala-lang.org (discurso).
Si necesita ayuda con su PR en cualquier momento, no dude en @-mention a cualquiera de la lista a continuación, y haremos todo lo posible para ayudarlo:
nombre de usuario | Háblame de ... | |
---|---|---|
@lrytz | Back End, Optimizer, Nombre y argumentos predeterminados, reporteros | |
@retronym | 2.12.x rama, rendimiento del compilador, bugs de compilador extraño, lambdas | |
@SethTisue | Comenzar, construir, CI, Community Build, Jenkins, Docs, Library, Reply | |
@dwijnand | Pattern Matcher, MIMA, Parte | |
@som-snytt | advertencias/peluches/errores, replica, opciones de compilador, compilador -internal, parte | |
@Ichoran | Biblioteca de colecciones, rendimiento | |
@viktorklang | concurrencia, futuros | |
@sjrd | interacciones con scala.js | |
@NthPortal | Biblioteca, concurrencia, scala.math , LazyList , Using , advertencias | |
@bishabosha | Lector sabroso | |
@joroKr21 | tipos de tipos, implicados, varianza de mayor tía |
PD: Si tiene algo de tiempo libre para ayudar por aquí, ¡estaríamos encantados de agregar su nombre a esta lista!
Apunte a la rama más antigua en la que desea que terminen sus cambios. Nos fusionamos periódicamente de las ramas de liberación anteriores (por ejemplo, 2.12.x) a otros nuevos (por ejemplo, 2.13.x).
Si su cambio es difícil de fusionar, es posible que se le solicite que envíe también un PR separado que se dirige a la rama más nueva.
Si su cambio es específico de la versión y no debe fusionarse hacia adelante, coloque [nomerge]
en el nombre de PR.
Si su cambio es un backport de una rama más nueva y, por lo tanto, no necesita fusionarse hacia adelante, ponga [backport]
en el nombre de PR.
La mayoría de los cambios deberían apuntar a 2.13.x. Somos cada vez más reacios a objetivo 2.12.x a menos que haya una razón especial (por ejemplo, si se encuentra un error especialmente malo o si hay patrocinio comercial).
La rama 2.11.x ahora está inactiva y no se planifican más lanzamientos de 2.11.x (a menos que surjan circunstancias inusuales e imprevisibles). No debe apuntar a 2.11.x sin preguntarle a los mantenedores primero.
Lo más importante:
scala/
+--build.sbt The main sbt build definition
+--project/ The rest of the sbt build
+--src/ All sources
+---/library Scala Standard Library
+---/reflect Scala Reflection
+---/compiler Scala Compiler
+--test/ The Scala test suite
+---/files Partest tests
+---/junit JUnit tests
+---/scalacheck ScalaCheck tests
+--spec/ The Scala language specification
Pero también:
scala/
+---/library-aux Scala Auxiliary Library, for bootstrapping and documentation purposes
+---/interactive Scala Interactive Compiler, for clients such as an IDE (aka Presentation Compiler)
+---/intellij IntelliJ project templates
+---/manual Scala's runner scripts "man" (manual) pages
+---/partest Scala's internal parallel testing framework
+---/partest-javaagent Partest's helper java agent
+---/repl Scala REPL core
+---/repl-frontend Scala REPL frontend
+---/scaladoc Scala's documentation tool
+---/scalap Scala's class file decompiler
+---/testkit Scala's unit-testing kit
+--admin/ Scripts for the CI jobs and releasing
+--doc/ Additional licenses and copyrights
+--scripts/ Scripts for the CI jobs and releasing
+--tools/ Scripts useful for local development
+--build/ Build products
+--dist/ Build products
+--target/ Build products
Necesita las siguientes herramientas:
MacOS y Linux funcionan. Windows puede funcionar si usa Cygwin. Se agradece la ayuda de la comunidad para mantener la compilación trabajando en Windows y documentar cualquier configuración necesaria.
Estamos agradecidos por las siguientes licencias de OSS:
Durante el desarrollo ordinario, una nueva construcción de Scala es construida por la versión publicada anteriormente, conocida como "Compilador de referencia" o, Slangily, como "Starr" (lanzamiento de referencia estable). Construir con Starr es suficiente para la mayoría de los tipos de cambios.
Sin embargo, una construcción completa de Scala está bootstrappped . Bootstrapping tiene dos pasos: primero, construya con Starr; Luego, construya nuevamente usando el compilador recién construido, dejando atrás a Starr. Esto garantiza que cada versión de Scala puede construirse por sí misma.
Si cambia la parte de generación de códigos del compilador Scala, sus cambios solo aparecerán en el código de bytes de la biblioteca y el compilador después de una bootstrap. Nuestro CI hace una construcción de arranque.
Bootstrapping localmente : para realizar una bootstrap, ejecute restarrFull
en una sesión SBT. Esto construirá y publicará la distribución de Scala a su repositorio de artefactos local y luego cambiará SBT para usar esa versión como su nueva scalaVersion
. Luego puede volver con reload
. Nota restarrFull
también escribirá la versión Starr en buildcharacter.properties
para que pueda volver a reiniciar con restarr
sin volver a publicar. Esto cambiará la sesión SBT para usar los directorios build-restarr
y target-restarr
en lugar de build
y target
, lo que evita eliminar los archivos de clase y los metadatos incrementales. IntelliJ continuará siendo configurado para compilar y ejecutar pruebas utilizando la versión Starr en versions.properties
.
Para la historia sobre cómo se llegó al esquema actual, ver https://groups.google.com/d/topic/scala-internals/gp5jsm1e0fo/discussion.
Construyendo con advertencias fatales : para hacer advertencias en el proyecto fatal (es decir, convertirlos en errores), ejecute set Global / fatalWarnings := true
en SBT (reemplace Global
con el nombre de un módulo, como reflect
, para hacer que las advertencias solo sean fatales para ese módulo). Para deshabilitar las advertencias fatales nuevamente, reload
SBT o ejecutar set Global / fatalWarnings := false
(nuevamente, reemplace Global
con el nombre de un módulo si solo habilita advertencias fatales para ese módulo). CI siempre tiene advertencias fatales habilitadas.
Una vez que haya comenzado una sesión sbt
, puede ejecutar uno de los comandos principales:
compile
compila todos los subproyectos (biblioteca, reflexión, compilador, Scaladoc, etc.)scala
/ scalac
Ejecute el repl / compilador directamente desde SBT (aceptar opciones / argumentos)enableOptimizer
recarga la compilación con el Optimizer Scala habilitado. Nuestros lanzamientos están construidos de esta manera. Habilite esto cuando trabaje en mejoras de rendimiento del compilador. Cuando el optimizador esté habilitado, la compilación será más lenta y las compilaciones incrementales pueden ser incorrectas.setupPublishCore
ejecuta enableOptimizer
y configura un número de versión basado en el GIT actual SHA. A menudo se usa como parte de Bootstrapping: sbt setupPublishCore publishLocal && sbt -Dstarr.version=<VERSION> testAll
dist/mkBin
genera scripts de corredores ( scala
, scalac
, etc.) build/quick/bin
dist/mkPack
crea una construcción en el formato de distribución de Scala en build/pack
junit/test
ejecuta las pruebas JUnit; junit/testOnly *Foo
ejecuta un subconjuntoscalacheck/test
ejecuta pruebas de Scalacheck, use testOnly
para ejecutar un subconjuntopartest
ejecuta pruebas de parcés (acepta opciones, prueba partest --help
)publishLocal
publica una distribución localmente (puede usarse como scalaVersion
en otros proyectos SBT)set baseVersionSuffix := "bin-abcd123-SNAPSHOT"
donde abcd123
es el hash de la revisión que se está publicando. También puede usar algo personalizado como "bin-mypatch"
. Esto cambia el número de versión de 2.13.2-SNAPSHOT
a algo más estable ( 2.13.2-bin-abcd123-SNAPSHOT
).-bin
marca la versión binaria compatible. Usarlo en SBT hará que la scalaBinaryVersion
sea 2.13
. Si la versión no es compatible binaria, recomendamos usar -pre
, EG, 2.14.0-pre-abcd123-SNAPSHOT
.set ThisBuild / Compile / packageDoc / publishArtifact := false
para omitir los documentos API de generación / publicación de la API (acelera el proceso). Si un comando da como resultado un mensaje de error como a module is not authorized to depend on itself
, puede ser que un complemento SBT global esté causando una dependencia cíclica. Intente deshabilitar complementos SBT globales (tal vez comentándolos temporalmente en ~/.sbt/1.0/plugins/plugins.sbt
).
Recomendamos mantener archivos de prueba locales en el directorio sandbox
que se enumera en el .gitignore
de la repositorio de Scala.
Tenga en cuenta que la compilación incremental de SBT a menudo es demasiado gruesa para la base de código de compilador de Scala y vuelve a compilar demasiados archivos, lo que resulta en largos tiempos de compilación (verifique SBT#1104 para el progreso en ese frente). Mientras tanto, puedes:
Sugerimos usar Idea IntelliJ (ver SRC/IntelliJ/ReadMe.MD).
Los metales también pueden funcionar, pero aún no tenemos instrucciones o configuración de muestra para eso. Una solicitud de atracción en esta área sería extremadamente bienvenida. Mientras tanto, estamos recolectando orientación en Scala/Scala-Dev#668.
Para usar el compilador incremental de IntelliJ:
dist/mkBin
en SBT para obtener una compilación y los scripts de corredor en build/quick/bin
Ahora puede editar y construir IntelliJ y usar los scripts (compilador, replica) para probar directamente sus cambios. También puede ejecutar los comandos scala
, scalac
y partest
en SBT. Habilite "Modo Ant" (explicado anteriormente) para evitar que el compilador incremental de SBT vuelva a compilar (demasiados) archivos antes de cada invocación partest
.
Nuestras pautas para contribuir se explican en contribuir. MD. Contiene información útil sobre nuestros estándares de codificación, pruebas, documentación, cómo usamos Git y GitHub y cómo revisar su código.
También es posible que desee consultar los siguientes recursos:
Una vez que envíe un PR, el SCALA CI probará automáticamente sus compromisos.
Nuestra configuración de CI siempre está evolucionando. Consulte Scala/Scala-Dev#751 para obtener más detalles sobre cómo funcionan actualmente las cosas y cómo esperamos que cambien.
Si ve un fracaso espurio en Jenkins, puede publicar /rebuild
como un comentario de relaciones públicas. SCABOT ReadMe enumera todos los comandos disponibles.
Si desea probar su parche antes de que todo sea pulido para su revisión, puede hacer que Travis CI construya su rama (asegúrese de tener un tenedor y tener Travis CI habilitado para las construcciones de la rama primero, y luego presione su rama). También siéntase libre de enviar un borrador de relaciones públicas. En caso de que su rama de borrador contenga una gran cantidad de confirmaciones (que aún no limpió / calabaza para su revisión), considere agregar [ci: last-only]
al título de relaciones públicas. De esa manera, solo se probará la última confirmación, ahorrando algo de energía y recursos de CI. Tenga en cuenta que el borrador inactivo se cerrará eventualmente, lo que no significa que el cambio se esté rechazando.
CI realiza una bootstrap de compilador. La primera tarea, validatePublishCore
, publica una compilación de su compromiso con el repositorio temporal https://scala-ci.typesafe.com/artifactory/scala-pr-validation-snapshots. Tenga en cuenta que esta compilación aún no está arrancada, su bytecode está construido utilizando el Starr actual. El número de versión es 2.13.2-bin-abcd123-SNAPSHOT
donde abcd123
es el hash de confirmación. Para construcciones incompatibles binarias, el número de versión es 2.14.0-pre-abcd123-SNAPSHOT
.
Puede usar las compilaciones de Scala en el repositorio de validación localmente agregando un resolución y especificando la scalaVersion
correspondiente:
$ sbt
> set resolvers += "pr" at "https://scala-ci.typesafe.com/artifactory/scala-pr-validation-snapshots/"
> set scalaVersion := "2.12.2-bin-abcd123-SNAPSHOT"
> console
El Scala CI publica estos a https://scala-ci.typesafe.com/artifactory/scala-ingration/.
El uso de una construcción nocturna en SBT y otras herramientas se explica en esta página DOC.
Aunque casualmente nos referimos a ellas como construcciones "nocturnas", en realidad no se construyen todas las noches, sino "de manera férula". Es decir, se publica una construcción para cada PR fusionado.
El Scala CI se ejecuta como una instancia de Jenkins en Scala-Ci.typesafe.com, configurada por un libro de cocina Chef en Scala/Scala-Jenkins-Infra.
El bot de construcción que observa PRS, las pruebas desencadenantes construyen y aplica la etiqueta "revisada" después de un comentario LGTM está en el repositorio de Scala/Scabot.
La construcción de la comunidad de Scala es un método importante para probar las versiones de Scala. Se puede lanzar una construcción de la comunidad para cualquier compromiso de Scala, incluso antes de que se haya fusionado el PR del comité. Esa confirmación se usa para construir una gran cantidad de proyectos de código abierto desde la fuente y ejecutar sus suites de prueba.
Para solicitar una ejecución de la comunidad en su PR, solo pregunte en un comentario sobre el PR y un miembro del equipo de Scala (probablemente @sethtisue) se encargará de ello. (detalles)
Las construcciones de la comunidad se ejecutan en la instancia de Scala Jenkins. Los trabajos se nombran ..-integrate-community-build
. Ver el repositorio de Scala/Community-Builds.