Compare commits

..

29 Commits

Author SHA1 Message Date
Dan Chao c1a9e9e12f Prepare 0.25.2 release 2024-02-08 15:53:05 -08:00
Dan Chao c60db2a450 Update changelog for release 0.25.2 2024-02-08 15:53:05 -08:00
Dan Chao 5379263839 Revert "remove duplicate publishing of pkl-cli-java (#98)"
This reverts commit 8e6ddfb9b7.
2024-02-08 15:53:05 -08:00
Daniel Chao e8a1213217 Fix more links (#104)
This fixes more documentation links that are producing 404's.
2024-02-08 15:50:42 -08:00
Daniel Chao dd9b47097f Fixes for pkldoc (#96)
* Add URI encoding to paths and fragments
* Render quotes around identifiers when appropriate
2024-02-08 15:50:42 -08:00
Daniel Chao bb90343ae0 Use packages for CircleCI definition (#95) 2024-02-08 15:50:42 -08:00
Islon Scherer 3a7ccc2128 remove duplicate publishing of pkl-cli-java (#98) 2024-02-08 15:50:42 -08:00
Ricardo Pinheiro a5fc32b684 Update Hidden Properties documentation (#91) 2024-02-08 15:50:42 -08:00
translatenix 7ab47e825f Only build static executable if musl toolchain is installed (#83)
This improves the development experience for (WSL) Linux users.
They can now run "./gradlew buildNative" without having a musl toolchain installed.
In this case, only the dynamically linked executable will be built.
2024-02-08 15:50:42 -08:00
Daniel Chao c6a9859969 Reword verbage to "pantry" (#64)
* Reword verbage to "pantry"

* Fix verbage
2024-02-08 15:50:42 -08:00
The L D O b25cec31b9 update 'Loading Modules' example to match config contents (#84)
Co-authored-by: Daniel Chao <dan.chao@apple.com>
2024-02-08 15:50:42 -08:00
Adrian Lanzafame e978f12a6d fix concat operator and string typo 2024-02-08 15:50:42 -08:00
James Ward 21bb67f5be Fix artifact name 2024-02-08 15:50:42 -08:00
Shubham Gupta 99eed53cd1 fix mangled url
Crash help text has mangled URL #61
2024-02-08 15:50:42 -08:00
kelvine 6ebf50a7f9 fixed typo on transiti[ti]on 2024-02-08 15:50:42 -08:00
Lily Ballard a2607dcc6e Fix CLI docs examples for -x
The examples were using the wrong key.
2024-02-08 15:50:42 -08:00
Lily Ballard c20119b1f6 Fix missing pkl eval subcommand in documentation examples 2024-02-08 15:50:42 -08:00
Daniel Chao 9e987b3523 Fix documentation homepage (#81)
This adds a trailing slash that was missing from the documentation
homepage.
2024-02-08 15:50:42 -08:00
Ryosuke Hayashi 6ec71ef198 Minor fix in the code of the docs 2024-02-08 15:50:42 -08:00
Dan Chao ffd0b8a17b Fix broken search on pkldoc 2024-02-08 15:50:42 -08:00
Edward Knight 0fd469f3a6 Fix minor discrepancy in workshop example (#60)
Map values of `agenda` should have a `name` instead of a `title` to be
consistent with the `TutorialPart` module.

Fixes #11.
2024-02-08 15:50:42 -08:00
Philip Hölzenspies 93b1e7ff01 Remove lingering, outdated build target pkldoc 2024-02-08 15:50:42 -08:00
Islon Scherer 0af3f4923a fix wrong stdlib doc links (#74)
(cherry picked from commit 3f8fae4873)
2024-02-08 15:50:42 -08:00
Brian Pfeil dc243a47c2 taxonomy nesting fix 2024-02-08 15:50:42 -08:00
Tinko b6c484b716 Fix macOS download URL mismatch (#29)
* Fix macOS download URL mismatch

* Update index.adoc

List aarch64 first

---------

Co-authored-by: Daniel Chao <daniel.h.chao@gmail.com>
2024-02-08 15:50:42 -08:00
Daniel Chao 42c32a1ad3 Fix download instructions (#21)
This fixes the download URLs for the pkl CLI
2024-02-08 15:50:42 -08:00
Dan Chao a5a00639ed Polish release notes 2024-02-08 15:50:42 -08:00
Dan Chao bf90b41069 Prepare 0.25.1 release 2024-02-08 15:50:42 -08:00
Dan Chao ba8279aeee Add dummy javadoc to pkl-tools 2024-02-08 15:50:42 -08:00
1663 changed files with 25546 additions and 61390 deletions
+15 -25
View File
@@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// File gets rendered to .circleci/config.yml via git hook. // File gets rendered to .circleci/config.yml via git hook.
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.2.0#/PklCI.pkl" amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.0.1#/PklCI.pkl"
import "jobs/BuildNativeJob.pkl" import "jobs/BuildNativeJob.pkl"
import "jobs/GradleCheckJob.pkl" import "jobs/GradleCheckJob.pkl"
@@ -25,13 +25,13 @@ local prbJobs: Listing<String> = gradleCheckJobs.keys.toListing()
local buildAndTestJobs = (prbJobs) { local buildAndTestJobs = (prbJobs) {
"bench" "bench"
"gradle-compatibility" // "gradle-compatibility"
...buildNativeJobs.keys.filter((it) -> it.endsWith("snapshot")) ...buildNativeJobs.keys.filter((it) -> it.endsWith("snapshot"))
} }
local releaseJobs = (prbJobs) { local releaseJobs = (prbJobs) {
"bench" "bench"
"gradle-compatibility" // "gradle-compatibility"
...buildNativeJobs.keys.filter((it) -> it.endsWith("release")) ...buildNativeJobs.keys.filter((it) -> it.endsWith("release"))
} }
@@ -71,10 +71,6 @@ release {
} }
} }
releaseBranch {
jobs = releaseJobs
}
triggerDocsBuild = "both" triggerDocsBuild = "both"
triggerPackageDocsBuild = "release" triggerPackageDocsBuild = "release"
@@ -96,24 +92,17 @@ local buildNativeJobs: Mapping<String, BuildNativeJob> = new {
musl = true musl = true
isRelease = _dist == "release" isRelease = _dist == "release"
} }
["pkl-cli-windows-amd64-\(_dist)"] {
arch = "amd64"
os = "windows"
isRelease = _dist == "release"
}
} }
} }
local gradleCheckJobs: Mapping<String, GradleCheckJob> = new { local gradleCheckJobs: Mapping<String, GradleCheckJob> = new {
["gradle-check"] { ["gradle-check-jdk11"] {
javaVersion = "21.0" javaVersion = "11.0"
isRelease = false isRelease = false
os = "linux"
} }
["gradle-check-windows"] { ["gradle-check-jdk17"] {
javaVersion = "21.0" javaVersion = "17.0"
isRelease = false isRelease = false
os = "windows"
} }
} }
@@ -129,27 +118,28 @@ jobs {
name = "gradle compatibility" name = "gradle compatibility"
command = #""" command = #"""
:pkl-gradle:build \ :pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases :pkl-gradle:compatibilityTestReleases \
:pkl-gradle:compatibilityTestCandidate
"""# """#
}.job }.job
["deploy-snapshot"] = new DeployJob { command = "publishToSonatype" }.job ["deploy-snapshot"] = new DeployJob {
command = "publishToSonatype"
}.job
["deploy-release"] = new DeployJob { ["deploy-release"] = new DeployJob {
isRelease = true isRelease = true
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository" command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
}.job }.job
["github-release"] { ["github-release"] {
docker { docker {
new { image = "maniator/gh:v2.40.1" } new {
image = "maniator/gh:v2.40.1"
}
} }
steps { steps {
new AttachWorkspaceStep { at = "." } new AttachWorkspaceStep { at = "." }
new RunStep { new RunStep {
name = "Publish release on GitHub" name = "Publish release on GitHub"
command = #""" command = #"""
# exclude build_artifacts.txt from publish
rm -f pkl-cli/build/executable/*.build_artifacts.txt
find pkl-cli/build/executable/* -type d | xargs rm -rf
rm -f pkl-cli/build/executable/resources
gh release create "${CIRCLE_TAG}" \ gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \ --title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \ --target "${CIRCLE_SHA1}" \
+167 -238
View File
@@ -9,34 +9,28 @@ jobs:
- run: - run:
command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license
name: Installing Rosetta 2 name: Installing Rosetta 2
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64 ./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home resource_class: macos.m1.large.gen1
resource_class: m2pro.large
macos: macos:
xcode: 15.3.0 xcode: 15.2.0
pkl-cli-linux-amd64-release: pkl-cli-linux-amd64-release:
steps: steps:
- checkout - checkout
@@ -51,8 +45,8 @@ jobs:
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -64,7 +58,7 @@ jobs:
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \ mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \ && cd /tmp/dep_zlib-1.2.13 \
@@ -77,7 +71,7 @@ jobs:
# install musl # install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \ mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \ && cd /tmp/dep_musl-1.2.2 \
@@ -100,12 +94,18 @@ jobs:
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64 ./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
@@ -118,33 +118,29 @@ jobs:
steps: steps:
- checkout - checkout
- run: - run:
command: |- command: git apply patches/graalVm23.patch
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64 ./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home resource_class: macos.m1.large.gen1
resource_class: m2pro.large
macos: macos:
xcode: 15.3.0 xcode: 15.2.0
pkl-cli-linux-aarch64-release: pkl-cli-linux-aarch64-release:
steps: steps:
- checkout - checkout
@@ -159,8 +155,8 @@ jobs:
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -172,7 +168,7 @@ jobs:
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \ mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \ && cd /tmp/dep_zlib-1.2.13 \
@@ -192,12 +188,18 @@ jobs:
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64 ./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
@@ -220,8 +222,8 @@ jobs:
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -233,7 +235,7 @@ jobs:
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \ mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \ && cd /tmp/dep_zlib-1.2.13 \
@@ -246,7 +248,7 @@ jobs:
# install musl # install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \ mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \ && cd /tmp/dep_musl-1.2.2 \
@@ -269,12 +271,18 @@ jobs:
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64 ./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
@@ -283,73 +291,34 @@ jobs:
resource_class: xlarge resource_class: xlarge
docker: docker:
- image: oraclelinux:8-slim - image: oraclelinux:8-slim
pkl-cli-windows-amd64-release:
steps:
- checkout
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_windows_hotspot_21.0.5_11.zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
name: Set up environment
shell: bash.exe
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:windowsExecutableAmd64 pkl-core:testWindowsExecutableAmd64 pkl-server:testWindowsExecutableAmd64
name: gradle buildNative
shell: bash.exe
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
pkl-cli-macOS-amd64-snapshot: pkl-cli-macOS-amd64-snapshot:
steps: steps:
- checkout - checkout
- run: - run:
command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license
name: Installing Rosetta 2 name: Installing Rosetta 2
- run:
command: |-
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64 ./gradlew --info --stacktrace pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home resource_class: macos.m1.large.gen1
resource_class: m2pro.large
macos: macos:
xcode: 15.3.0 xcode: 15.2.0
pkl-cli-linux-amd64-snapshot: pkl-cli-linux-amd64-snapshot:
steps: steps:
- checkout - checkout
@@ -364,8 +333,8 @@ jobs:
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -377,7 +346,7 @@ jobs:
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \ mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \ && cd /tmp/dep_zlib-1.2.13 \
@@ -390,7 +359,7 @@ jobs:
# install musl # install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \ mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \ && cd /tmp/dep_musl-1.2.2 \
@@ -413,12 +382,18 @@ jobs:
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64 ./gradlew --info --stacktrace pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
@@ -431,33 +406,29 @@ jobs:
steps: steps:
- checkout - checkout
- run: - run:
command: |- command: git apply patches/graalVm23.patch
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
name: Set up environment
shell: '#!/bin/bash -exo pipefail'
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64 ./gradlew --info --stacktrace pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
JAVA_HOME: /Users/distiller/jdk/Contents/Home resource_class: macos.m1.large.gen1
resource_class: m2pro.large
macos: macos:
xcode: 15.3.0 xcode: 15.2.0
pkl-cli-linux-aarch64-snapshot: pkl-cli-linux-aarch64-snapshot:
steps: steps:
- checkout - checkout
@@ -472,8 +443,8 @@ jobs:
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -485,7 +456,7 @@ jobs:
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \ mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \ && cd /tmp/dep_zlib-1.2.13 \
@@ -505,12 +476,18 @@ jobs:
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64 ./gradlew --info --stacktrace pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
@@ -533,8 +510,8 @@ jobs:
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2B1/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20.1_1.tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -546,7 +523,7 @@ jobs:
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-1.2.13 \ mkdir -p /tmp/dep_zlib-1.2.13 \
&& cd /tmp/dep_zlib-1.2.13 \ && cd /tmp/dep_zlib-1.2.13 \
@@ -559,7 +536,7 @@ jobs:
# install musl # install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-1.2.2 \ mkdir -p /tmp/dep_musl-1.2.2 \
&& cd /tmp/dep_musl-1.2.2 \ && cd /tmp/dep_musl-1.2.2 \
@@ -582,12 +559,18 @@ jobs:
- run: - run:
command: |- command: |-
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64 ./gradlew --info --stacktrace pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64
name: gradle buildNative name: gradle buildNative
- persist_to_workspace: - persist_to_workspace:
root: '.' root: '.'
paths: paths:
- pkl-cli/build/executable/ - pkl-cli/build/executable/
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
@@ -596,147 +579,125 @@ jobs:
resource_class: xlarge resource_class: xlarge
docker: docker:
- image: oraclelinux:8-slim - image: oraclelinux:8-slim
pkl-cli-windows-amd64-snapshot: gradle-check-jdk11:
steps: steps:
- checkout - checkout
- run: - run:
command: |- command: ./gradlew --info --stacktrace check
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_windows_hotspot_21.0.5_11.zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
name: Set up environment
shell: bash.exe
- run:
command: |-
export PATH=~/staticdeps/bin:$PATH
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:windowsExecutableAmd64 pkl-core:testWindowsExecutableAmd64 pkl-server:testWindowsExecutableAmd64
name: gradle buildNative
shell: bash.exe
- persist_to_workspace:
root: '.'
paths:
- pkl-cli/build/executable/
- store_test_results:
path: ~/test-results
environment:
LANG: en_US.UTF-8
JAVA_HOME: /jdk
resource_class: windows.large
machine:
image: windows-server-2022-gui:current
gradle-check:
steps:
- checkout
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true check
name: gradle check name: gradle check
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
docker: docker:
- image: cimg/openjdk:21.0 - image: cimg/openjdk:11.0
gradle-check-windows: gradle-check-jdk17:
steps: steps:
- checkout - checkout
- run: - run:
command: |- command: ./gradlew --info --stacktrace check
# install jdk
curl -Lf \
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_windows_hotspot_21.0.5_11.zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
name: Set up environment
shell: bash.exe
- run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true check
name: gradle check name: gradle check
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
JAVA_HOME: /jdk docker:
resource_class: windows.large - image: cimg/openjdk:17.0
machine:
image: windows-server-2022-gui:current
bench: bench:
steps: steps:
- checkout - checkout
- run: - run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true bench:jmh command: ./gradlew --info --stacktrace bench:jmh
name: bench:jmh name: bench:jmh
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
docker: docker:
- image: cimg/openjdk:21.0 - image: cimg/openjdk:11.0
gradle-compatibility: gradle-compatibility:
steps: steps:
- checkout - checkout
- run: - run:
command: |- command: |-
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true :pkl-gradle:build \ ./gradlew --info --stacktrace :pkl-gradle:build \
:pkl-gradle:compatibilityTestReleases :pkl-gradle:compatibilityTestReleases \
:pkl-gradle:compatibilityTestCandidate
name: gradle compatibility name: gradle compatibility
- run:
command: |-
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
docker: docker:
- image: cimg/openjdk:21.0 - image: cimg/openjdk:11.0
deploy-snapshot: deploy-snapshot:
steps: steps:
- checkout - checkout
- attach_workspace: - attach_workspace:
at: '.' at: '.'
- run: - run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true publishToSonatype command: ./gradlew --info --stacktrace publishToSonatype
- persist_to_workspace: - run:
root: '.' command: |-
paths: mkdir ~/test-results/
- pkl-cli/build/executable/ find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
docker: docker:
- image: cimg/openjdk:21.0 - image: cimg/openjdk:11.0
deploy-release: deploy-release:
steps: steps:
- checkout - checkout
- attach_workspace: - attach_workspace:
at: '.' at: '.'
- run: - run:
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository command: ./gradlew --info --stacktrace -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
- persist_to_workspace: - run:
root: '.' command: |-
paths: mkdir ~/test-results/
- pkl-cli/build/executable/ find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
name: Gather test results
when: always
- store_test_results: - store_test_results:
path: ~/test-results path: ~/test-results
environment: environment:
LANG: en_US.UTF-8 LANG: en_US.UTF-8
docker: docker:
- image: cimg/openjdk:21.0 - image: cimg/openjdk:11.0
github-release: github-release:
steps: steps:
- attach_workspace: - attach_workspace:
at: '.' at: '.'
- run: - run:
command: |- command: |-
# exclude build_artifacts.txt from publish
rm -f pkl-cli/build/executable/*.build_artifacts.txt
find pkl-cli/build/executable/* -type d | xargs rm -rf
rm -f pkl-cli/build/executable/resources
gh release create "${CIRCLE_TAG}" \ gh release create "${CIRCLE_TAG}" \
--title "${CIRCLE_TAG}" \ --title "${CIRCLE_TAG}" \
--target "${CIRCLE_SHA1}" \ --target "${CIRCLE_SHA1}" \
@@ -780,40 +741,38 @@ workflows:
type: approval type: approval
- pr-approval/authenticate: - pr-approval/authenticate:
context: pkl-pr-approval context: pkl-pr-approval
- gradle-check: - gradle-check-jdk11:
requires: requires:
- hold - hold
- gradle-check-windows: - pr-approval/authenticate
- gradle-check-jdk17:
requires: requires:
- hold - hold
- pr-approval/authenticate
when: when:
matches: matches:
value: << pipeline.git.branch >> value: << pipeline.git.branch >>
pattern: ^pull/\d+(/head)?$ pattern: ^pull/\d+(/head)?$
main: main:
jobs: jobs:
- gradle-check - gradle-check-jdk11
- gradle-check-windows - gradle-check-jdk17
- bench - bench
- gradle-compatibility
- pkl-cli-macOS-amd64-snapshot - pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot - pkl-cli-linux-amd64-snapshot
- pkl-cli-macOS-aarch64-snapshot - pkl-cli-macOS-aarch64-snapshot
- pkl-cli-linux-aarch64-snapshot - pkl-cli-linux-aarch64-snapshot
- pkl-cli-linux-alpine-amd64-snapshot - pkl-cli-linux-alpine-amd64-snapshot
- pkl-cli-windows-amd64-snapshot
- deploy-snapshot: - deploy-snapshot:
requires: requires:
- gradle-check - gradle-check-jdk11
- gradle-check-windows - gradle-check-jdk17
- bench - bench
- gradle-compatibility
- pkl-cli-macOS-amd64-snapshot - pkl-cli-macOS-amd64-snapshot
- pkl-cli-linux-amd64-snapshot - pkl-cli-linux-amd64-snapshot
- pkl-cli-macOS-aarch64-snapshot - pkl-cli-macOS-aarch64-snapshot
- pkl-cli-linux-aarch64-snapshot - pkl-cli-linux-aarch64-snapshot
- pkl-cli-linux-alpine-amd64-snapshot - pkl-cli-linux-alpine-amd64-snapshot
- pkl-cli-windows-amd64-snapshot
context: pkl-maven-release context: pkl-maven-release
- trigger-docsite-build: - trigger-docsite-build:
requires: requires:
@@ -826,13 +785,13 @@ workflows:
- << pipeline.git.branch >> - << pipeline.git.branch >>
release: release:
jobs: jobs:
- gradle-check: - gradle-check-jdk11:
filters: filters:
branches: branches:
ignore: /.*/ ignore: /.*/
tags: tags:
only: /^v?\d+\.\d+\.\d+$/ only: /^v?\d+\.\d+\.\d+$/
- gradle-check-windows: - gradle-check-jdk17:
filters: filters:
branches: branches:
ignore: /.*/ ignore: /.*/
@@ -844,12 +803,6 @@ workflows:
ignore: /.*/ ignore: /.*/
tags: tags:
only: /^v?\d+\.\d+\.\d+$/ only: /^v?\d+\.\d+\.\d+$/
- gradle-compatibility:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-macOS-amd64-release: - pkl-cli-macOS-amd64-release:
filters: filters:
branches: branches:
@@ -880,24 +833,16 @@ workflows:
ignore: /.*/ ignore: /.*/
tags: tags:
only: /^v?\d+\.\d+\.\d+$/ only: /^v?\d+\.\d+\.\d+$/
- pkl-cli-windows-amd64-release:
filters:
branches:
ignore: /.*/
tags:
only: /^v?\d+\.\d+\.\d+$/
- github-release: - github-release:
requires: requires:
- gradle-check - gradle-check-jdk11
- gradle-check-windows - gradle-check-jdk17
- bench - bench
- gradle-compatibility
- pkl-cli-macOS-amd64-release - pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release - pkl-cli-linux-amd64-release
- pkl-cli-macOS-aarch64-release - pkl-cli-macOS-aarch64-release
- pkl-cli-linux-aarch64-release - pkl-cli-linux-aarch64-release
- pkl-cli-linux-alpine-amd64-release - pkl-cli-linux-alpine-amd64-release
- pkl-cli-windows-amd64-release
context: pkl-github-release context: pkl-github-release
filters: filters:
branches: branches:
@@ -923,19 +868,3 @@ workflows:
ignore: /.*/ ignore: /.*/
tags: tags:
only: /^v?\d+\.\d+\.\d+$/ only: /^v?\d+\.\d+\.\d+$/
release-branch:
jobs:
- gradle-check
- gradle-check-windows
- bench
- gradle-compatibility
- pkl-cli-macOS-amd64-release
- pkl-cli-linux-amd64-release
- pkl-cli-macOS-aarch64-release
- pkl-cli-linux-aarch64-release
- pkl-cli-linux-alpine-amd64-release
- pkl-cli-windows-amd64-release
when:
matches:
value: << pipeline.git.branch >>
pattern: ^release/\d+\.\d+$
+29 -49
View File
@@ -16,7 +16,11 @@
/// Builds the native `pkl` CLI /// Builds the native `pkl` CLI
extends "GradleJob.pkl" extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl" import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.uri@1.0.0#/URI.pkl"
/// The OS to run on
os: "macOS"|"linux"
/// The architecture to use /// The architecture to use
arch: "amd64"|"aarch64" arch: "amd64"|"aarch64"
@@ -24,11 +28,13 @@ arch: "amd64"|"aarch64"
/// Whether to link to musl. Otherwise, links to glibc. /// Whether to link to musl. Otherwise, links to glibc.
musl: Boolean = false musl: Boolean = false
javaVersion = "21.0"
local setupLinuxEnvironment: Config.RunStep = local setupLinuxEnvironment: Config.RunStep =
let (jdkVersion = "11.0.20.1+1")
let (muslVersion = "1.2.2") let (muslVersion = "1.2.2")
let (zlibVersion = "1.2.13") let (zlibVersion = "1.2.13")
let (jdkVersionEncoded = URI.encodeComponent(jdkVersion))
let (jdkVersionAlt = jdkVersion.replaceLast("+", "_"))
let (majorJdkVersion = jdkVersion.split(".").first)
new { new {
name = "Set up environment" name = "Set up environment"
shell = "#!/bin/bash -exo pipefail" shell = "#!/bin/bash -exo pipefail"
@@ -40,8 +46,8 @@ local setupLinuxEnvironment: Config.RunStep =
&& rm -rf /var/cache/dnf && rm -rf /var/cache/dnf
# install jdk # install jdk
curl -Lf \ curl -L \
https://github.com/adoptium/temurin\#(module.majorJdkVersion)-binaries/releases/download/\#(module.jdkGitHubReleaseName)/OpenJDK\#(module.majorJdkVersion)U-jdk_\#(if (arch == "amd64") "x64" else "aarch64")_linux_hotspot_\#(module.jdkVersionAlt).tar.gz -o /tmp/jdk.tar.gz https://github.com/adoptium/temurin\#(majorJdkVersion)-binaries/releases/download/jdk-\#(jdkVersionEncoded)/OpenJDK\#(majorJdkVersion)U-jdk_\#(if (arch == "amd64") "x64" else "aarch64")_linux_hotspot_\#(jdkVersionAlt).tar.gz -o /tmp/jdk.tar.gz
mkdir /jdk \ mkdir /jdk \
&& cd /jdk \ && cd /jdk \
@@ -53,7 +59,7 @@ local setupLinuxEnvironment: Config.RunStep =
# install zlib # install zlib
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
curl -Lf https://github.com/madler/zlib/releases/download/v\#(zlibVersion)/zlib-\#(zlibVersion).tar.gz -o /tmp/zlib.tar.gz curl -L https://github.com/madler/zlib/releases/download/v\#(zlibVersion)/zlib-\#(zlibVersion).tar.gz -o /tmp/zlib.tar.gz
mkdir -p /tmp/dep_zlib-\#(zlibVersion) \ mkdir -p /tmp/dep_zlib-\#(zlibVersion) \
&& cd /tmp/dep_zlib-\#(zlibVersion) \ && cd /tmp/dep_zlib-\#(zlibVersion) \
@@ -69,7 +75,7 @@ local setupLinuxEnvironment: Config.RunStep =
#""" #"""
# install musl # install musl
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
curl -Lf https://musl.libc.org/releases/musl-\#(muslVersion).tar.gz -o /tmp/musl.tar.gz curl -L https://musl.libc.org/releases/musl-\#(muslVersion).tar.gz -o /tmp/musl.tar.gz
mkdir -p /tmp/dep_musl-\#(muslVersion) \ mkdir -p /tmp/dep_musl-\#(muslVersion) \
&& cd /tmp/dep_musl-\#(muslVersion) \ && cd /tmp/dep_musl-\#(muslVersion) \
@@ -87,22 +93,6 @@ local setupLinuxEnvironment: Config.RunStep =
}.join("\n\n") }.join("\n\n")
} }
local setupMacEnvironment: Config.RunStep =
new {
name = "Set up environment"
shell = "#!/bin/bash -exo pipefail"
command =
#"""
# install jdk
curl -Lf \
https://github.com/adoptium/temurin\#(module.majorJdkVersion)-binaries/releases/download/\#(module.jdkGitHubReleaseName)/OpenJDK\#(module.majorJdkVersion)U-jdk_\#(if (arch == "amd64") "x64" else "aarch64")_mac_hotspot_\#(module.jdkVersionAlt).tar.gz -o /tmp/jdk.tar.gz
mkdir $HOME/jdk \
&& cd $HOME/jdk \
&& cat /tmp/jdk.tar.gz | tar --strip-components=1 -xzC .
"""#
}
steps { steps {
when (os == "linux") { when (os == "linux") {
new Config.RestoreCacheStep { new Config.RestoreCacheStep {
@@ -118,8 +108,7 @@ steps {
} }
} }
} }
when (os == "macOS") { when (os == "macOS" && arch == "amd64") {
when (arch == "amd64") {
new Config.RunStep { new Config.RunStep {
name = "Installing Rosetta 2" name = "Installing Rosetta 2"
command = """ command = """
@@ -127,22 +116,24 @@ steps {
""" """
} }
} }
setupMacEnvironment // If building macOS/aarch64, we need to use GraalVM 23.
// We can't use GraalVM 23 for any other build because we need to support Java 11, which was
// dropped in GraalVM 23.
when (os == "macOS" && arch == "aarch64") {
new Config.RunStep {
command = "git apply patches/graalVm23.patch"
}
} }
new Config.RunStep { new Config.RunStep {
name = "gradle buildNative" name = "gradle buildNative"
local _os = local _os =
if (module.os == "macOS") "mac" if (os == "macOS") "mac"
else if (musl) "alpine" else if (musl) "alpine"
else if (module.os == "windows") "windows"
else "linux" else "linux"
local jobName = "\(_os)Executable\(arch.capitalize())" local jobName = "\(_os)Executable\(arch.capitalize())"
when (module.os == "windows") {
shell = "bash.exe"
}
command = #""" command = #"""
export PATH=~/staticdeps/bin:$PATH export PATH=~/staticdeps/bin:$PATH
./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize()) pkl-server:test\#(jobName.capitalize()) ./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize())
"""# """#
} }
new Config.PersistToWorkspaceStep { new Config.PersistToWorkspaceStep {
@@ -156,15 +147,13 @@ steps {
job { job {
when (os == "macOS") { when (os == "macOS") {
macos { macos {
xcode = "15.3.0" xcode = "15.2.0"
} }
resource_class = "m2pro.large" // Use M1 for all architectures. We build amd64/aarch64 based on the GraalVM version,
environment { // which gets patched in via `git apply patches/graalVm23.patch`.
["JAVA_HOME"] = "/Users/distiller/jdk/Contents/Home" resource_class = "macos.m1.large.gen1"
} } else {
} docker {
when (os == "linux") {
docker = new Listing<Config.DockerImage> {
new { new {
image = if (arch == "aarch64") "arm64v8/oraclelinux:8-slim" else "oraclelinux:8-slim" image = if (arch == "aarch64") "arm64v8/oraclelinux:8-slim" else "oraclelinux:8-slim"
} }
@@ -174,13 +163,4 @@ job {
} }
resource_class = if (arch == "aarch64") "arm.xlarge" else "xlarge" resource_class = if (arch == "aarch64") "arm.xlarge" else "xlarge"
} }
when (os == "windows") {
machine {
image = "windows-server-2022-gui:current"
}
resource_class = "windows.large"
environment {
["JAVA_HOME"] = "/jdk"
}
}
} }
+6 -11
View File
@@ -15,26 +15,21 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
extends "GradleJob.pkl" extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl" import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
local self = this local self = this
javaVersion = "21.0"
command: String command: String
os = "linux" job {
docker {
new { image = "cimg/openjdk:11.0" }
}
}
steps { steps {
new Config.AttachWorkspaceStep { at = "." } new Config.AttachWorkspaceStep { at = "." }
new Config.RunStep { new Config.RunStep {
command = "./gradlew \(self.gradleArgs) \(module.command)" command = "./gradlew \(self.gradleArgs) \(module.command)"
} }
// add jpkl to workspace so it gets published as a GitHub release
new Config.PersistToWorkspaceStep {
root = "."
paths {
"pkl-cli/build/executable/"
}
}
} }
+11 -1
View File
@@ -15,7 +15,9 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
extends "GradleJob.pkl" extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl" import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
javaVersion: "11.0"|"17.0"
steps { steps {
new Config.RunStep { new Config.RunStep {
@@ -23,3 +25,11 @@ steps {
command = "./gradlew \(module.gradleArgs) check" command = "./gradlew \(module.gradleArgs) check"
} }
} }
job {
docker {
new {
image = "cimg/openjdk:\(javaVersion)"
}
}
}
+10 -58
View File
@@ -15,39 +15,14 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
abstract module GradleJob abstract module GradleJob
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl" import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.uri@1.0.3#/URI.pkl"
/// Whether this is a release build or not. /// Whether this is a release build or not.
isRelease: Boolean = false isRelease: Boolean = false
/// The OS to run on
os: "macOS"|"linux"|"windows"
/// The version of Java to use.
javaVersion: "17.0"|"21.0"
fixed javaVersionFull =
if (javaVersion == "17.0") "17.0.9+9"
else "21.0.5+11"
fixed jdkVersionAlt = javaVersionFull.replaceLast("+", "_")
fixed majorJdkVersion = javaVersionFull.split(".").first
fixed jdkGitHubReleaseName =
let (ver =
// 17.0.9+9 is missing some binaries (see https://github.com/adoptium/adoptium-support/issues/994)
if (javaVersionFull == "17.0.9+9" && os == "windows") "jdk-17.0.9+9.1"
else "jdk-\(javaVersionFull)"
)
URI.encodeComponent(ver)
fixed gradleArgs = new Listing { fixed gradleArgs = new Listing {
"--info" "--info"
"--stacktrace" "--stacktrace"
"-DtestReportsDir=${HOME}/test-results"
"-DpklMultiJdkTesting=true"
when (isRelease) { when (isRelease) {
"-DreleaseBuild=true" "-DreleaseBuild=true"
} }
@@ -58,42 +33,19 @@ steps: Listing<Config.Step>
job: Config.Job = new { job: Config.Job = new {
environment { environment {
["LANG"] = "en_US.UTF-8" ["LANG"] = "en_US.UTF-8"
when (os == "windows") {
["JAVA_HOME"] = "/jdk"
}
}
when (os == "linux") {
docker {
new {
image = "cimg/openjdk:\(javaVersion)"
}
}
}
when (os == "windows") {
machine {
image = "windows-server-2022-gui:current"
}
resource_class = "windows.large"
} }
steps { steps {
"checkout" "checkout"
when (os == "windows") {
new Config.RunStep {
name = "Set up environment"
shell = "bash.exe"
command = #"""
# install jdk
curl -Lf \
https://github.com/adoptium/temurin\#(majorJdkVersion)-binaries/releases/download/\#(jdkGitHubReleaseName)/OpenJDK\#(majorJdkVersion)U-jdk_x64_windows_hotspot_\#(jdkVersionAlt).zip -o /tmp/jdk.zip
unzip /tmp/jdk.zip -d /tmp/jdk \
&& cd /tmp/jdk/jdk-* \
&& mkdir /jdk \
&& cp -r . /jdk
"""#
}
}
...module.steps ...module.steps
new Config.RunStep {
// find all test results and write them to the home dir
name = "Gather test results"
command = """
mkdir ~/test-results/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \\;
"""
`when` = "always"
}
new Config.StoreTestResults { new Config.StoreTestResults {
path = "~/test-results" path = "~/test-results"
} }
+7 -5
View File
@@ -15,16 +15,12 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
extends "GradleJob.pkl" extends "GradleJob.pkl"
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl" import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.0.0#/Config.pkl"
name: String = command name: String = command
command: String command: String
os = "linux"
javaVersion = "21.0"
steps { steps {
new Config.RunStep { new Config.RunStep {
name = module.name name = module.name
@@ -33,3 +29,9 @@ steps {
""" """
} }
} }
job {
docker {
new { image = "cimg/openjdk:11.0" }
}
}
-2
View File
@@ -1,2 +0,0 @@
# Auto-format Kotlin code
816cd483c8adf4c04e14236c173a1dc6bd2579ea
+1 -11
View File
@@ -3,14 +3,4 @@
/docs/** linguist-documentation /docs/** linguist-documentation
*.pcf linguist-language=Pkl *.pkl linguist-language=Groovy
PklProject linguist-language=Pkl
* text eol=lf
*.bat text eol=crlf
*.gif binary
*.jar binary
*.woff2 binary
*.pem binary
*.png binary
-8
View File
@@ -5,23 +5,15 @@
.gradle/ .gradle/
build/ build/
generated/ generated/
testgenerated/
# IntelliJ # IntelliJ
.idea/ .idea/
!.idea/icon.svg
!.idea/codestyles/ !.idea/codestyles/
!.idea/inspectionProfiles/ !.idea/inspectionProfiles/
!.idea/runConfigurations/ !.idea/runConfigurations/
!.idea/scopes/ !.idea/scopes/
!.idea/vcs.xml !.idea/vcs.xml
.vscode/
.pkl-lsp/
# :pkl-core:makeIntelliJAntlrPluginHappy # :pkl-core:makeIntelliJAntlrPluginHappy
gen/ gen/
PklLexer.tokens PklLexer.tokens
.kotlin/
-23
View File
@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100.58 98.63">
<path d="m75.57,19.78l2.43-13.25c-3.69-2.46-7.7-4.42-11.91-5.83l-8.97,10.05c-4.37-.8-8.85-.83-13.23-.08L35.03.5c-4.23,1.35-8.26,3.26-11.99,5.68l2.26,13.28c-3.35,2.92-6.17,6.4-8.32,10.3l-13.46.58c-1.58,4.15-2.6,8.49-3.03,12.91l11.8,6.51c.19,4.44,1.16,8.81,2.86,12.92l-7.94,10.89c2.26,3.82,5.02,7.33,8.2,10.42l12.45-5.16c3.59,2.62,7.62,4.59,11.89,5.82l3.56,13c4.4.62,8.86.64,13.26.08l3.72-12.95c4.29-1.17,8.34-3.09,11.96-5.67l12.38,5.32c3.22-3.05,6.03-6.52,8.33-10.32l-7.8-10.99c1.75-4.08,2.78-8.45,3.03-12.88l11.88-6.36c-.38-4.42-1.34-8.78-2.87-12.95l-13.45-.75c-2.1-3.92-4.87-7.44-8.19-10.4Z"
style="fill:#6b9543; stroke-width:0px;"/>
<circle cx="51.05" cy="47.72" r="31.49" style="fill:#e9f4ca; stroke-width:0px;"/>
<g id="_Radial_Repeat_">
<path d="m28.79,62.54c8.22,14.22,24.82,18.97,20.85-10.47h0c-.31-2.29-1.56-4.35-3.45-5.68-24.66-17.36-26.37.64-17.4,16.15Zm15.42-8.25h0c.7-.17,1.24.13,1.49.83,3.27,9.16-2.6,12.49-6.71,10.44-3.77-1.88-3.77-9.01,5.22-11.27Zm-2.14-5.45c.48.57.47,1.19-.03,1.7h0c-6.44,6.67-12.62,3.1-12.37-1.09.27-4.58,6.09-8.01,12.4-.61Z"
style="fill:#c8d987; stroke-width:0px;"/>
<ellipse cx="38.62" cy="55.01" rx="7.64" ry="14.03" transform="translate(-22.33 26.68) rotate(-30)"
style="fill:#c8d987; stroke-width:0px;"/>
</g>
<g id="_Radial_Repeat_-2">
<path d="m49.34,21.03c-16.42.01-28.84,12.01-1.36,23.29h0c2.14.88,4.54.82,6.64-.15,27.37-12.67,12.63-23.16-5.29-23.15Zm-.56,17.48h0c-.2.69-.73,1.01-1.46.88-9.57-1.75-9.52-8.5-5.69-11.03,3.51-2.32,9.69,1.24,7.15,10.16Zm5.79.87c-.73.13-1.27-.18-1.46-.88h0c-2.56-8.91,3.62-12.48,7.13-10.17,3.83,2.53,3.9,9.28-5.67,11.04Z"
style="fill:#c8d987; stroke-width:0px;"/>
<ellipse cx="50.94" cy="33.31" rx="14.03" ry="7.64" style="fill:#c8d987; stroke-width:0px;"/>
</g>
<g id="_Radial_Repeat_-3">
<path d="m75.02,59.59c8.2-14.23,4.02-30.98-19.5-12.82h0c-1.83,1.41-2.99,3.52-3.19,5.83-2.71,30.04,13.74,22.52,22.69,7Zm-14.86-9.23h0c-.5-.52-.51-1.14-.03-1.7,6.3-7.41,12.12-3.99,12.4.59.26,4.2-5.92,7.77-12.37,1.11Zm-3.65,4.58c.25-.7.79-1,1.49-.83h0c8.99,2.24,9,9.38,5.24,11.26-4.1,2.05-9.98-1.26-6.73-10.43Z"
style="fill:#c8d987; stroke-width:0px;"/>
<ellipse cx="63.58" cy="54.83" rx="14.03" ry="7.64" transform="translate(-15.7 82.48) rotate(-60)"
style="fill:#c8d987; stroke-width:0px;"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

-31
View File
@@ -15,37 +15,6 @@
<inspection_tool class="FieldMayBeFinal" enabled="true" level="INFORMATION" enabled_by_default="true"> <inspection_tool class="FieldMayBeFinal" enabled="true" level="INFORMATION" enabled_by_default="true">
<scope name="AllExceptTruffleAst" level="WARNING" enabled="true" /> <scope name="AllExceptTruffleAst" level="WARNING" enabled="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="HttpUrlsUsage" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredUrls">
<list>
<option value="http://" />
<option value="http://0.0.0.0" />
<option value="http://127.0.0.1" />
<option value="http://activemq.apache.org/schema/" />
<option value="http://cxf.apache.org/schemas/" />
<option value="http://java.sun.com/" />
<option value="http://javafx.com/fxml" />
<option value="http://javafx.com/javafx/" />
<option value="http://json-schema.org/draft" />
<option value="http://localhost" />
<option value="http://maven.apache.org/POM/" />
<option value="http://maven.apache.org/xsd/" />
<option value="http://primefaces.org/ui" />
<option value="http://schema.cloudfoundry.org/spring/" />
<option value="http://schemas.xmlsoap.org/" />
<option value="http://tiles.apache.org/" />
<option value="http://www.ibm.com/webservices/xsd" />
<option value="http://www.jboss.com/xml/ns/" />
<option value="http://www.jboss.org/j2ee/schema/" />
<option value="http://www.springframework.org/schema/" />
<option value="http://www.springframework.org/security/tags" />
<option value="http://www.springframework.org/tags" />
<option value="http://www.thymeleaf.org" />
<option value="http://www.w3.org/" />
<option value="http://xmlns.jcp.org/" />
</list>
</option>
</inspection_tool>
<inspection_tool class="JavadocBlankLines" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="JavadocBlankLines" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="NullableProblems" enabled="true" level="WARNING" enabled_by_default="false"> <inspection_tool class="NullableProblems" enabled="true" level="WARNING" enabled_by_default="false">
<scope name="AllExceptGenerated" level="WARNING" enabled="true"> <scope name="AllExceptGenerated" level="WARNING" enabled="true">
+1 -1
View File
@@ -1,3 +1,3 @@
<component name="DependencyValidationManager"> <component name="DependencyValidationManager">
<scope name="AllExceptTruffleAst" pattern="(src:*..*||test:*..*||lib:*..*)&amp;&amp;!src[pkl.pkl-core.main]:org.pkl.core.ast..*&amp;&amp;!src[pkl.pkl-core.main]:org.pkl.core.stdlib..*Nodes" /> <scope name="AllExceptTruffleAst" pattern="(src:*..*||test:*..*||lib:*..*)&amp;&amp;!src[pkl.pkl-core.main]:com.apple.pkl.core.ast..*&amp;&amp;!src[pkl.pkl-core.main]:com.apple.pkl.core.stdlib..*Nodes" />
</component> </component>
+1 -1
View File
@@ -1 +1 @@
21 17.0
+10 -9
View File
@@ -1,6 +1,6 @@
## Code of Conduct == Code of Conduct
### Our Pledge === Our Pledge
In the interest of fostering an open and welcoming environment, we as In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our contributors and maintainers pledge to making participation in our
@@ -10,7 +10,7 @@ characteristics, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation. race, religion, or sexual identity and orientation.
### Our Standards === Our Standards
Examples of behavior that contributes to creating a positive environment Examples of behavior that contributes to creating a positive environment
include: include:
@@ -33,7 +33,7 @@ electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a * Other conduct which could reasonably be considered inappropriate in a
professional setting professional setting
### Our Responsibilities === Our Responsibilities
Project maintainers are responsible for clarifying the standards of Project maintainers are responsible for clarifying the standards of
acceptable behavior and are expected to take appropriate and fair acceptable behavior and are expected to take appropriate and fair
@@ -45,7 +45,7 @@ contributions that are not aligned to this Code of Conduct, or to ban
temporarily or permanently any contributor for other behaviors that they temporarily or permanently any contributor for other behaviors that they
deem inappropriate, threatening, offensive, or harmful. deem inappropriate, threatening, offensive, or harmful.
### Scope === Scope
This Code of Conduct applies within all project spaces, and it also This Code of Conduct applies within all project spaces, and it also
applies when an individual is representing the project or its community applies when an individual is representing the project or its community
@@ -55,7 +55,7 @@ official social media account, or acting as an appointed representative
at an online or offline event. Representation of a project may be at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers. further defined and clarified by project maintainers.
### Enforcement === Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may Instances of abusive, harassing, or otherwise unacceptable behavior may
be reported by contacting the open source team at be reported by contacting the open source team at
@@ -70,8 +70,9 @@ Project maintainers who do not follow or enforce the Code of Conduct in
good faith may face temporary or permanent repercussions as determined good faith may face temporary or permanent repercussions as determined
by other members of the projects leadership. by other members of the projects leadership.
### Attribution === Attribution
This Code of Conduct is adapted from the This Code of Conduct is adapted from the
[Contributor Covenant](https://www.contributor-covenant.org), version 1.4, https://www.contributor-covenant.org[Contributor Covenant], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+18 -41
View File
@@ -2,22 +2,20 @@
:uri-gng: https://gng.dsun.org :uri-gng: https://gng.dsun.org
:uri-jenv: https://www.jenv.be :uri-jenv: https://www.jenv.be
:uri-intellij: https://www.jetbrains.com/idea/download/ :uri-intellij: https://www.jetbrains.com/idea/download/
:uri-native-prerequisites-linux: https://www.graalvm.org/latest/getting-started/linux/#prerequisites-for-native-image-on-linux :uri-jdk: https://adoptopenjdk.net/releases.html
:uri-native-prerequisites-windows: https://www.graalvm.org/latest/getting-started/windows/#prerequisites-for-native-image-on-windows
== Setup == Setup
. (mandatory) Install a JDK (JDK 21+ required). . (mandatory) Install {uri-jdk}[OpenJDK 11 HotSpot] (as long as we support JDK11)
. (recommended) Install {uri-intellij}[IntelliJ IDEA] + . (mandatory) Setup Gradle on your system
. (recommended) Install {uri-intellij}[IntelliJ IDEA 2023.x] +
To import the project into IntelliJ, go to File->Open and select the project's root directory. To import the project into IntelliJ, go to File->Open and select the project's root directory.
If the project is opened but not imported, look for a popup in the lower right corner If the project is opened but not imported, look for a popup in the lower right corner
and click its "Import Gradle Project" link. and click its "Import Gradle Project" link.
. (recommended) Install {uri-gng}[gng] + . (recommended) Install {uri-gng}[gng] +
_gng_ enables to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory. _gng_ enables to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory.
. (recommended) Set up Git ignore-revs +
`git config blame.ignoreRevsFile .git-blame-ignore-revs`
. (recommended) Install {uri-jenv}[jenv] and plugins + . (recommended) Install {uri-jenv}[jenv] and plugins +
_jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 21. + _jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 17. +
Enable _jenv_ plugins for better handling by `gradle`: Enable _jenv_ plugins for better handling by `gradle`:
+ +
[source,shell] [source,shell]
@@ -25,39 +23,20 @@ Enable _jenv_ plugins for better handling by `gradle`:
jenv enable-plugin gradle jenv enable-plugin gradle
jenv enable-plugin export jenv enable-plugin export
---- ----
. (optional) If you've named the original apple/pkl git repository something other than `origin`, set env var `PKL_ORIGINAL_REMOTE_NAME` to that name in your `.bashrc`, `.zshrc`, `config.fish` or however you manage your local environment.
+
This will allow spotless to pick the correct starting branch when formatting source code files.
Otherwise, you might see that _every_ file has its copyright year updated.
=== Additional Linux Setup
. (optional) To build the native executable (`./gradlew buildNative`),
install {uri-native-prerequisites-linux}[Prerequisites For Native Image on Linux].
=== Additional Windows Setup
. (optional) Go to `System->For developers` and enable `Developer Mode`.
Otherwise, some tests may fail due to insufficient file system privileges.
. (optional) To build the native executable (`./gradlew buildNative`),
install {uri-native-prerequisites-windows}[Prerequisites For Native Image on Windows].
== Common Build Commands == Common Build Commands
[source,shell] [source,shell]
---- ----
gw clean gw clean
gw test # run all tests except native executable tests gw test
gw testNative # run native executable tests
gw spotlessApply # fix code formatting
gw build # build everything except native executables gw build # build everything except native executables
gw buildNative # build native executable(s) for current platform gw buildNative # build macOS executable on macOS,
# (Alpine executable is only built if ~/staticdeps/bin/musl-gcc exists) # Linux and Alpine executables on Linux
gw pkldoc # generate standard library docs
pkl-cli/build/executable/jpkl # run Java executable pkl-cli/build/executable/jpkl # run Java executable
pkl-cli/build/executable/pkl-macos-aarch64 # run Mac executable pkl-cli/build/executable/pkl-macos-amd64 # run Mac executable
pkl-cli/build/executable/pkl-macos-amd64 # run Intel Mac executable
pkl-cli/build/executable/pkl-linux-amd64 # run Linux executable
pkl-cli/build/executable/pkl-alpine-linux-amd64 # run Alpine Linux executable
pkl-cli/build/executable/pkl-windows-amd64.exe # run Windows executable
---- ----
== Update Gradle == Update Gradle
@@ -83,18 +62,16 @@ based on version information from https://search.maven.org, https://plugins.grad
* Truffle code generation is performed by Truffle's annotation processor, which runs as part of task `:pkl-core:compileJava` * Truffle code generation is performed by Truffle's annotation processor, which runs as part of task `:pkl-core:compileJava`
** Output dir is `generated/truffle/` ** Output dir is `generated/truffle/`
* ANTLR code generation is performed by task `:pkl-core:generateTestGrammarSource` * ANTLR code generation is performed by task `:pkl-core:generateGrammarSource`
** Output dir is `testgenerated/antlr/` ** Output dir is `generated/antlr/`
== Remote JVM Debugging
To enable remote JVM debugging when running Gradle tasks (e.g. test), add the flag `-Djvmdebug=true`.
This will listen on port 5005.
Example: `./gradlew test -Djvmdebug=true`
== Resources == Resources
For automated build setup examples see our https://github.com/apple/pkl/blob/main/.circleci/[CircleCI] jobs like our https://github.com/apple/pkl/blob/main/.circleci/jobs/BuildNativeJob.pkl[BuildNativeJob.pkl], where we build Pkl automatically.
=== ANTLR
* https://github.com/antlr/antlr4/blob/main/doc/index.md[Documentation]
* https://groups.google.com/forum/#!forum/antlr-discussion[Forums]
* https://github.com/mobileink/lab.clj.antlr/tree/main/doc[Some third-party docs]
=== Truffle === Truffle
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright © 2024-2025 Apple Inc. and the Pkl project authors Copyright © 2024 Apple Inc. and the Pkl project authors
Portions of this software were originally based on 'SnakeYAML' developed by Andrey Somov. Portions of this software were originally based on 'SnakeYAML' developed by Andrey Somov.
+1 -78
View File
@@ -1,4 +1,4 @@
= image:.idea/icon.svg[Pkl,30] Pkl = Pkl
:uri-homepage: https://pkl-lang.org :uri-homepage: https://pkl-lang.org
:uri-docs: {uri-homepage}/main/current :uri-docs: {uri-homepage}/main/current
@@ -11,8 +11,6 @@
:uri-pkl-examples: https://pkl-lang.org/main/current/examples.html :uri-pkl-examples: https://pkl-lang.org/main/current/examples.html
:uri-installation: https://pkl-lang.org/main/current/pkl-cli/index.html#installation :uri-installation: https://pkl-lang.org/main/current/pkl-cli/index.html#installation
:uri-lang-reference: https://pkl-lang.org/main/current/language-reference/index.html :uri-lang-reference: https://pkl-lang.org/main/current/language-reference/index.html
:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/
:uri-ci-pipeline: https://app.circleci.com/pipelines/github/apple/pkl
A configuration as code language with rich validation and tooling. A configuration as code language with rich validation and tooling.
@@ -36,78 +34,3 @@ We'd love to hear from you!
* Create an {uri-github-issue}[issue] * Create an {uri-github-issue}[issue]
* Ask a question on {uri-github-discussions}[GitHub Discussions] * Ask a question on {uri-github-discussions}[GitHub Discussions]
== Development image:https://circleci.com/gh/apple/pkl.svg?style=svg["Apple", link="https://app.circleci.com/pipelines/github/apple/pkl"]
* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues
* link:DEVELOPMENT.adoc[] for build instructions
* {uri-ci-artifacts}[Sonatype Repository] for the artifacts/binaries built by our {uri-ci-pipeline}[CI pipelines] (and those of our other tools and packages repositories).
== Pkl GitHub Repositories
[%autowidth]
|===
|Name |Description
|`apple/pkl`
|A configuration as code language with rich validation and tooling.
|https://github.com/apple/pkl-evolution[`apple/pkl-evolution`]
|Suggested Pkl Improvements, Changes, or Enhancements (SPICEs)
|https://github.com/apple/pkl-go[`apple/pkl-go`]
|Pkl bindings for the Go programming language
|https://github.com/apple/pkl-go-examples[`apple/pkl-go-examples`]
|Examples for using Pkl within Go applications
|https://github.com/apple/pkl-intellij[`apple/pkl-intellij`]
|JetBrains editor plugins providing Pkl language support
|https://github.com/apple/pkl-jvm-examples[`apple/pkl-jvm-examples`]
|Examples for using Pkl within JVM applications
|https://github.com/apple/pkl-k8s[`apple/pkl-k8s`]
|Templates for using Pkl with Kubernetes
|https://github.com/apple/pkl-k8s-examples[`apple/pkl-k8s-examples`]
|Examples for using Pkl with Kubernetes
|https://github.com/apple/pkl-lang.org[`apple/pkl-lang.org`]
|The pkl-lang.org website
|https://github.com/apple/pkl-lsp[`apple/pkl-lsp`]
| Language server for Pkl, implementing the server-side of the Language Server Protocol
|https://github.com/apple/pkl-neovim[`apple/pkl-neovim`]
|Pkl language support for Neovim
|https://github.com/apple/pkl-package-docs[`apple/pkl-package-docs`]
|Documentation for Pkl packages
|https://github.com/apple/pkl-pantry[`apple/pkl-pantry`]
|Shared Pkl packages
|https://github.com/apple/pkl-project-commons[`apple/pkl-project-commons`]
|Utility libraries for Pkl
|https://github.com/apple/pkl-spring[`apple/pkl-spring`]
|Spring Boot extension for configuring Boot apps with Pkl
|https://github.com/apple/pkl-swift[`apple/pkl-swift`]
|Pkl bindings for the Swift programming language
|https://github.com/apple/pkl-swift-examples[`apple/pkl-swift-examples`]
|Examples for using Pkl within Swift applications
|https://github.com/apple/pkl-vscode[`apple/pkl-vscode`]
|Pkl language support for VS Code
|https://github.com/apple/pkl.tmbundle[`apple/pkl.tmbundle`]
|TextMate bundle for Pkl
|https://github.com/apple/rules_pkl[`apple/rules_pkl`]
| Bazel build rules for Pkl
|https://github.com/apple/tree-sitter-pkl[`apple/tree-sitter-pkl`]
|Tree-sitter parser for Pkl
|===
+3 -3
View File
@@ -1,13 +1,13 @@
# Security = Security
For the protection of our community, the Pkl team does not disclose, discuss, or confirm security issues until our investigation is complete and any necessary updates are generally available. For the protection of our community, the Pkl team does not disclose, discuss, or confirm security issues until our investigation is complete and any necessary updates are generally available.
## Reporting a security vulnerability == Reporting a security vulnerability
If you have discovered a security vulnerability within the Pkl project, please report it to us. If you have discovered a security vulnerability within the Pkl project, please report it to us.
We welcome reports from everyone, including security researchers, developers, and users. We welcome reports from everyone, including security researchers, developers, and users.
Security vulnerabilities may be reported on the [Report a vulnerability](https://security.apple.com/submit) form. Security vulnerabilities may be reported on the link:https://security.apple.com/submit[Report a vulnerability] form.
When submitting a vulnerability, select "Apple Devices and Software" as the affected platform, and "Open Source" as the affected area. When submitting a vulnerability, select "Apple Devices and Software" as the affected platform, and "Open Source" as the affected area.
For more information, see https://pkl-lang.org/security.html. For more information, see https://pkl-lang.org/security.html.
+32 -21
View File
@@ -26,7 +26,18 @@ Copyright © 2017 Square, Inc.
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
4) GeantyRef (https://github.com/leangen/geantyref) 4) ANTLR 4 Runtime (Optimized) (http://tunnelvisionlabs.com)
POM License: The BSD License - http://www.antlr.org/license.html
Copyright (c) 2012 Terence Parr and Sam Harwell
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5) GeantyRef (https://github.com/leangen/geantyref)
Manifest license URL: https://www.apache.org/licenses/LICENSE-2.0 Manifest license URL: https://www.apache.org/licenses/LICENSE-2.0
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
@@ -36,7 +47,7 @@ Copyright © 2017 Kaqqao
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5) commonmark-java core 6) commonmark-java core
POM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause POM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause
Embedded license: Embedded license:
@@ -67,7 +78,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6) commonmark-java extension for tables 7) commonmark-java extension for tables
POM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause POM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause
Embedded license: Embedded license:
@@ -98,7 +109,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7) jansi (http://fusesource.com/) 8) jansi (http://fusesource.com/)
Manifest license URL: https://www.apache.org/licenses/LICENSE-2.0 Manifest license URL: https://www.apache.org/licenses/LICENSE-2.0
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
@@ -108,13 +119,13 @@ Copyright © Fusesource 2023
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
8) Graal Sdk (https://github.com/oracle/graal) 9) Graal Sdk (https://github.com/oracle/graal)
POM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL POM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL
9) Truffle API (http://openjdk.java.net/projects/graal) 10) Truffle API (http://openjdk.java.net/projects/graal)
POM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL POM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL
10) IntelliJ IDEA Annotations (http://www.jetbrains.org) 11) IntelliJ IDEA Annotations (http://www.jetbrains.org)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -122,7 +133,7 @@ Copyright © Jetbrains 2023
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
11) kotlin-reflect (https://kotlinlang.org/) 12) kotlin-reflect (https://kotlinlang.org/)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -130,7 +141,7 @@ Copyright © Wuseal 2018
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
12) kotlin-stdlib (https://kotlinlang.org/) 13) kotlin-stdlib (https://kotlinlang.org/)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -138,7 +149,7 @@ Copyright © 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contribu
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
13) kotlin-stdlib-common (https://kotlinlang.org/) 14) kotlin-stdlib-common (https://kotlinlang.org/)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -146,7 +157,7 @@ Copyright © 2023 Kotlin Team
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
14) kotlin-stdlib-jdk7 (https://kotlinlang.org/) 15) kotlin-stdlib-jdk7 (https://kotlinlang.org/)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -154,7 +165,7 @@ Copyright © 2023 Kotlin Team
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
15) kotlin-stdlib-jdk8 (https://kotlinlang.org/) 16) kotlin-stdlib-jdk8 (https://kotlinlang.org/)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -162,7 +173,7 @@ Copyright © 2023 Kotlin Team
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
16) kotlinx.html (https://github.com/Kotlin/kotlinx.html) 17) kotlinx.html (https://github.com/Kotlin/kotlinx.html)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -170,7 +181,7 @@ Copyright © 2017 Yole
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
17) kotlinx-serialization-core (https://github.com/Kotlin/kotlinx.serialization) 18) kotlinx-serialization-core (https://github.com/Kotlin/kotlinx.serialization)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -178,7 +189,7 @@ The Apache License
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
18) kotlinx-serialization-json (https://github.com/Kotlin/kotlinx.serialization) 19) kotlinx-serialization-json (https://github.com/Kotlin/kotlinx.serialization)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -186,7 +197,7 @@ The Apache License
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
19) JLine Reader 20) JLine Reader
Manifest license URL: https://opensource.org/licenses/BSD-3-Clause Manifest license URL: https://opensource.org/licenses/BSD-3-Clause
POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause
@@ -205,7 +216,7 @@ software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20) JLine Terminal 21) JLine Terminal
Manifest license URL: https://opensource.org/licenses/BSD-3-Clause Manifest license URL: https://opensource.org/licenses/BSD-3-Clause
POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause
@@ -224,7 +235,7 @@ software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21) JLine JANSI Terminal 22) JLine JANSI Terminal
Manifest license URL: https://opensource.org/licenses/BSD-3-Clause Manifest license URL: https://opensource.org/licenses/BSD-3-Clause
POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause
@@ -243,7 +254,7 @@ software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22) msgpack-core (https://msgpack.org/) 23) msgpack-core (https://msgpack.org/)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -251,7 +262,7 @@ Copyright © 2016 Sadayuki Furuhashi, Muga Nishizawa, Taro L. Saito, Mitsunori K
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
23) Paguro (https://github.com/GlenKPeterson/Paguro) 24) Paguro (https://github.com/GlenKPeterson/Paguro)
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
The Apache License The Apache License
@@ -353,7 +364,7 @@ Everyone is permitted to copy and distribute copies of this Agreement, but in or
This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
24) SnakeYAML Engine (http://www.snakeyaml.org) 25) SnakeYAML Engine (http://www.snakeyaml.org)
Manifest license URL: https://www.apache.org/licenses/LICENSE-2.0 Manifest license URL: https://www.apache.org/licenses/LICENSE-2.0
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0 POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
+18 -28
View File
@@ -1,44 +1,31 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
plugins { plugins {
pklAllProjects pklAllProjects
pklJavaLibrary pklJavaLibrary
pklGraalVm
id("me.champeau.jmh") id("me.champeau.jmh")
} }
val truffle: Configuration by configurations.creating val truffle: Configuration by configurations.creating
val graal: Configuration by configurations.creating val graal: Configuration by configurations.creating
@Suppress("UnstableApiUsage")
dependencies { dependencies {
jmh(projects.pklCore) jmh(project(":pkl-core"))
jmh(projects.pklCommonsTest) // necessary because antlr4-runtime is declared as implementation dependency in pkl-core.gradle
jmh(libs.antlrRuntime)
truffle(libs.truffleApi) truffle(libs.truffleApi)
graal(libs.graalCompiler) graal(libs.graalCompiler)
} }
jmh { jmh {
// include = ["fib_class_java"] //include = ["fib_class_java"]
// include = ["fib_class_constrained1", "fib_class_constrained2"] //include = ["fib_class_constrained1", "fib_class_constrained2"]
jmhVersion.set(libs.versions.jmh) jmhVersion.set(libs.versions.jmh)
// jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " + // jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " +
// "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " + // "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " +
// "-Dgraal.TruffleFunctionInlining=false" // "-Dgraal.TruffleFunctionInlining=false"
jvm.set("${buildInfo.graalVmAmd64.baseDir}/bin/java") jvm.set("${buildInfo.graalVm.baseDir}/bin/java")
// see: // see: https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
// https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
jvmArgs.set( jvmArgs.set(
listOf( listOf(
// one JVM arg per list element doesn't work, but the following does // one JVM arg per list element doesn't work, but the following does
@@ -46,13 +33,16 @@ jmh {
) )
) )
includeTests.set(false) includeTests.set(false)
// threads = Runtime.runtime.availableProcessors() / 2 + 1 //threads = Runtime.runtime.availableProcessors() / 2 + 1
// synchronizeIterations = false //synchronizeIterations = false
} }
tasks.named("jmh") { dependsOn(":installGraalVmAmd64") } tasks.named("jmh") {
dependsOn(":installGraalVm")
}
// Prevent this error which occurs when building in IntelliJ: // Prevent this error which occurs when building in IntelliJ:
// "Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has // "Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has been set."
// been set." tasks.processJmhResources {
tasks.processJmhResources { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
+37 -56
View File
@@ -1,62 +1,43 @@
# This is a Gradle generated file for dependency locking. # This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
net.bytebuddy:byte-buddy:1.15.11=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath com.tunnelvisionlabs:antlr4-runtime:4.9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.apache.commons:commons-math3:3.6.1=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath org.apache.commons:commons-math3:3.2=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.apiguardian:apiguardian-api:1.1.2=jmhCompileClasspath,jmhImplementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.27.3=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.compiler:compiler:24.1.2=graal org.graalvm.compiler:compiler:22.3.1=graal
org.graalvm.polyglot:polyglot:24.1.2=jmh,jmhRuntimeClasspath,truffle org.graalvm.sdk:graal-sdk:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
org.graalvm.sdk:collections:24.1.2=graal,jmh,jmhRuntimeClasspath,truffle org.graalvm.truffle:truffle-api:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
org.graalvm.sdk:graal-sdk:24.1.2=jmh,jmhRuntimeClasspath org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.graalvm.sdk:nativeimage:24.1.2=jmh,jmhRuntimeClasspath,truffle org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.graalvm.sdk:word:24.1.2=graal,jmh,jmhRuntimeClasspath,truffle org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.graalvm.truffle:truffle-api:24.1.2=jmh,jmhRuntimeClasspath,truffle org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10=kotlinKlibCommonizerClasspath
org.graalvm.truffle:truffle-compiler:24.1.2=graal org.jetbrains.kotlin:kotlin-reflect:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-script-runtime:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-build-tools-impl:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-daemon-client:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.0.21=kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-reflect:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-script-runtime:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath org.junit.jupiter:junit-jupiter-engine:5.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-common:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17 org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17 org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17 org.junit.platform:junit-platform-engine:1.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-jvm:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17 org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.openjdk.jmh:jmh-core:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.openjdk.jmh:jmh-generator-asm:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.openjdk.jmh:jmh-generator-bytecode:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.openjdk.jmh:jmh-generator-reflection:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.jetbrains:annotations:13.0=jmh,jmhCompileClasspath,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath,testCompileClasspath,testRuntimeClasspath org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-api:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.jupiter:junit-jupiter-engine:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.8.2=testJdk17RuntimeClasspath
org.junit.jupiter:junit-jupiter-params:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-params:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.jupiter:junit-jupiter:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.platform:junit-platform-commons:1.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-commons:1.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.junit.platform:junit-platform-engine:1.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.8.2=testJdk17RuntimeClasspath
org.junit.platform:junit-platform-launcher:1.8.2=testJdk17RuntimeClasspath
org.junit:junit-bom:5.11.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.8.2=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.msgpack:msgpack-core:0.9.8=jmh,jmhRuntimeClasspath
org.openjdk.jmh:jmh-core:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-asm:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-bytecode:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-reflection:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.opentest4j:opentest4j:1.2.0=testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testJdk17RuntimeClasspath
org.opentest4j:opentest4j:1.3.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath org.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath
org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath org.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.9=jmh,jmhRuntimeClasspath org.snakeyaml:snakeyaml-engine:2.5=jmh,jmhRuntimeClasspath
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,jmhAnnotationProcessor,jmhApiDependenciesMetadata,jmhCompileOnlyDependenciesMetadata,jmhIntransitiveDependenciesMetadata,jmhKotlinScriptDef,jmhKotlinScriptDefExtensions,jmhRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testJdk17AnnotationProcessor,testJdk17ApiDependenciesMetadata,testJdk17CompileOnlyDependenciesMetadata,testJdk17IntransitiveDependenciesMetadata,testJdk17KotlinScriptDefExtensions,testKotlinScriptDef,testKotlinScriptDefExtensions empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileClasspath,compileOnly,compileOnlyDependenciesMetadata,default,implementationDependenciesMetadata,intransitiveDependenciesMetadata,jmhAnnotationProcessor,jmhApiDependenciesMetadata,jmhCompile,jmhCompileOnly,jmhCompileOnlyDependenciesMetadata,jmhIntransitiveDependenciesMetadata,jmhKotlinScriptDef,jmhKotlinScriptDefExtensions,jmhRuntime,jmhRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeClasspath,runtimeOnlyDependenciesMetadata,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
@@ -1,4 +1,4 @@
/* /**
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved. * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
/* /**
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved. * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,6 @@ import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.util.TempFile; import org.openjdk.jmh.util.TempFile;
import org.openjdk.jmh.util.TempFileManager; import org.openjdk.jmh.util.TempFileManager;
import org.pkl.core.http.HttpClient;
import org.pkl.core.module.ModuleKeyFactories; import org.pkl.core.module.ModuleKeyFactories;
import org.pkl.core.repl.ReplRequest; import org.pkl.core.repl.ReplRequest;
import org.pkl.core.repl.ReplResponse; import org.pkl.core.repl.ReplResponse;
@@ -40,7 +39,6 @@ public class ListSort {
private static final ReplServer repl = private static final ReplServer repl =
new ReplServer( new ReplServer(
SecurityManagers.defaultManager, SecurityManagers.defaultManager,
HttpClient.dummyClient(),
Loggers.stdErr(), Loggers.stdErr(),
List.of(ModuleKeyFactories.standardLibrary), List.of(ModuleKeyFactories.standardLibrary),
List.of(ResourceReaders.file()), List.of(ResourceReaders.file()),
@@ -50,8 +48,7 @@ public class ListSort {
null, null,
null, null,
IoUtils.getCurrentWorkingDir(), IoUtils.getCurrentWorkingDir(),
StackFrameTransformers.defaultTransformer, StackFrameTransformers.defaultTransformer);
false);
private static final List<Object> list = new ArrayList<>(100000); private static final List<Object> list = new ArrayList<>(100000);
static { static {
@@ -112,10 +109,10 @@ public class ListSort {
// append `.length` to avoid rendering the list // append `.length` to avoid rendering the list
new ReplRequest.Eval("sort", "nums.sortWith(cmp).length", false, false)) new ReplRequest.Eval("sort", "nums.sortWith(cmp).length", false, false))
.get(0); .get(0);
if (!(response instanceof ReplResponse.EvalSuccess success)) { if (!(response instanceof ReplResponse.EvalSuccess)) {
throw new AssertionError(response); throw new AssertionError(response);
} }
return success.getResult(); return ((ReplResponse.EvalSuccess) response).getResult();
} }
// note that this is an uneven comparison // note that this is an uneven comparison
@@ -1,5 +1,5 @@
/* /**
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved. * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -15,15 +15,8 @@
*/ */
package org.pkl.core.parser; package org.pkl.core.parser;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.annotations.*;
import org.pkl.commons.test.FileTestUtils;
import org.pkl.commons.test.FileTestUtilsKt;
import org.pkl.core.Release;
import org.pkl.core.util.IoUtils;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Warmup(iterations = 5, time = 2) @Warmup(iterations = 5, time = 2)
@@ -31,33 +24,36 @@ import org.pkl.core.util.IoUtils;
@OutputTimeUnit(TimeUnit.SECONDS) @OutputTimeUnit(TimeUnit.SECONDS)
@Fork(1) @Fork(1)
public class ParserBenchmark { public class ParserBenchmark {
// One-time execution of this code took ~10s until moving rule alternative
// for parenthesized expression after alternative for anonymous function.
@Benchmark @Benchmark
public void parseStdlib() { public void run() {
for (var stdlibModule : Release.current().standardLibrary().modules()) { new Parser()
try { .parseModule(
var moduleSource = "a1 {\n"
IoUtils.readClassPathResourceAsString( + " a2 {\n"
getClass(), "/org/pkl/core/stdlib/%s.pkl".formatted(stdlibModule.substring(4))); + " a3 {\n"
new Parser().parseModule(moduleSource); + " a4 {\n"
} catch (IOException e) { + " a5 {\n"
throw new UncheckedIOException(e); + " a6 {\n"
} + " a7 {\n"
} + " a8 {\n"
} + " a9 {\n"
+ " a10 {\n"
@Benchmark + " a11 {\n"
public void parseSnippetTests() { + " a12 {\n"
var snippetTestDir = + " a13 = map(map(map((x) -> 1)))\n"
FileTestUtils.getRootProjectDir() + " }\n"
.resolve("pkl-core/src/test/files/LanguageSnippetTests/input"); + " }\n"
for (var snippet : FileTestUtilsKt.listFilesRecursively(snippetTestDir)) { + " }\n"
try { + " }\n"
var moduleSource = Files.readString(snippet); + " }\n"
new Parser().parseModule(moduleSource); + " }\n"
} catch (IOException e) { + " }\n"
throw new UncheckedIOException(e); + " }\n"
} catch (ParserError ignore) { + " }\n"
} + " }\n"
} + " }\n"
+ "}");
} }
} }
+8 -22
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// https://youtrack.jetbrains.com/issue/KTIJ-19369 // https://youtrack.jetbrains.com/issue/KTIJ-19369
@file:Suppress("DSL_SCOPE_VIOLATION") @file:Suppress("DSL_SCOPE_VIOLATION")
@@ -55,12 +40,15 @@ idea {
} }
} }
val clean by tasks.existing { delete(layout.buildDirectory) } val clean by tasks.registering(Delete::class) {
delete(buildDir)
}
val printVersion by tasks.registering { doFirst { println(buildInfo.pklVersion) } } val printVersion by tasks.registering {
doFirst { println(buildInfo.pklVersion) }
}
val message = val message = """
"""
==== ====
Gradle version : ${gradle.gradleVersion} Gradle version : ${gradle.gradleVersion}
Java version : ${System.getProperty("java.version")} Java version : ${System.getProperty("java.version")}
@@ -75,7 +63,5 @@ Git Commit ID : ${buildInfo.commitId}
==== ====
""" """
val formattedMessage = val formattedMessage = message.replace("\n====", "\n" + "=".repeat(message.lines().maxByOrNull { it.length }!!.length))
message.replace("\n====", "\n" + "=".repeat(message.lines().maxByOrNull { it.length }!!.length))
logger.info(formattedMessage) logger.info(formattedMessage)
+5 -38
View File
@@ -1,50 +1,17 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
`kotlin-dsl` `kotlin-dsl`
`jvm-toolchains`
} }
// Keep this in sync with the constants in `BuildInfo.kt` (those are not addressable here).
val toolchainVersion = 21
dependencies { dependencies {
implementation(libs.downloadTaskPlugin) implementation(libs.downloadTaskPlugin)
implementation(libs.spotlessPlugin) implementation(libs.spotlessPlugin)
implementation(libs.kotlinPlugin) { exclude(module = "kotlin-android-extensions") } implementation(libs.kotlinPlugin) {
exclude(module = "kotlin-android-extensions")
}
implementation(libs.shadowPlugin) implementation(libs.shadowPlugin)
// fix from the Gradle team: makes version catalog symbols available in build scripts
// see here for more: https://github.com/gradle/gradle/issues/15383
implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
} }
java { java {
sourceCompatibility = JavaVersion.toVersion(toolchainVersion) sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.toVersion(toolchainVersion) targetCompatibility = JavaVersion.VERSION_11
toolchain {
languageVersion = JavaLanguageVersion.of(toolchainVersion)
vendor = JvmVendorSpec.ADOPTIUM
}
}
kotlin {
jvmToolchain(toolchainVersion)
compilerOptions { jvmTarget = JvmTarget.fromTarget(toolchainVersion.toString()) }
} }
+5 -20
View File
@@ -1,22 +1,5 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:Suppress("UnstableApiUsage") @file:Suppress("UnstableApiUsage")
rootProject.name = "buildSrc"
pluginManagement { pluginManagement {
repositories { repositories {
mavenCentral() mavenCentral()
@@ -24,12 +7,14 @@ pluginManagement {
} }
} }
plugins { id("org.gradle.toolchains.foojay-resolver-convention") }
// makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional // makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional
dependencyResolutionManagement { dependencyResolutionManagement {
// use same version catalog as main build // use same version catalog as main build
versionCatalogs { register("libs") { from(files("../gradle/libs.versions.toml")) } } versionCatalogs {
register("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
repositories { repositories {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
+55 -309
View File
@@ -1,113 +1,81 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:Suppress("MemberVisibilityCanBePrivate") @file:Suppress("MemberVisibilityCanBePrivate")
import java.io.File import java.io.File
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.attributes.Category import org.gradle.api.artifacts.VersionConstraint
import org.gradle.api.plugins.JvmTestSuitePlugin import org.gradle.kotlin.dsl.getByType
import org.gradle.api.plugins.jvm.JvmTestSuite
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.testing.Test
import org.gradle.internal.extensions.stdlib.capitalized
import org.gradle.jvm.toolchain.*
import org.gradle.kotlin.dsl.*
import org.gradle.kotlin.dsl.support.serviceOf
import org.gradle.process.CommandLineArgumentProvider
import org.gradle.testing.base.TestingExtension
/**
* JVM bytecode target; this is pinned at a reasonable version, because downstream JVM projects
* which consume Pkl will need a minimum Bytecode level at or above this one.
*
* Kotlin and Java need matching bytecode targets, so this is expressed as a build setting and
* constant default. To override, pass `-DpklJdkToolchain=X` to the Gradle command line, where X is
* a major Java version.
*/
const val PKL_JVM_TARGET_DEFAULT_MAXIMUM = 17
/**
* The Pkl build requires JDK 21+ to build, because JDK 17 is no longer within the default set of
* supported JDKs for GraalVM. This is a build-time requirement, not a runtime requirement.
*/
const val PKL_JDK_VERSION_MIN = 21
/**
* The JDK minimum is set to match the bytecode minimum, to guarantee that fat JARs work against the
* earliest supported bytecode target.
*/
const val PKL_TEST_JDK_MINIMUM = PKL_JVM_TARGET_DEFAULT_MAXIMUM
/**
* Maximum JDK version which Pkl is tested with; this should be bumped when new JDK stable releases
* are issued. At the time of this writing, JDK 23 is the latest available release.
*/
const val PKL_TEST_JDK_MAXIMUM = 23
/**
* Test the full suite of JDKs between [PKL_TEST_JDK_MINIMUM] and [PKL_TEST_JDK_MAXIMUM]; if this is
* set to `false` (or overridden on the command line), only LTS releases are tested by default.
*/
const val PKL_TEST_ALL_JDKS = false
// `buildInfo` in main build scripts // `buildInfo` in main build scripts
// `project.extensions.getByType<BuildInfo>()` in precompiled script plugins // `project.extensions.getByType<BuildInfo>()` in precompiled script plugins
open class BuildInfo(private val project: Project) { open class BuildInfo(project: Project) {
inner class GraalVm(val arch: String) { val self = this
inner class GraalVm {
val homeDir: String by lazy { val homeDir: String by lazy {
System.getenv("GRAALVM_HOME") ?: "${System.getProperty("user.home")}/.graalvm" System.getenv("GRAALVM_HOME") ?: "${System.getProperty("user.home")}/.graalvm"
} }
val version: String by lazy { libs.findVersion("graalVm").get().toString() } val version: String by lazy {
libs.findVersion("graalVm").get().toString()
}
val graalVmJdkVersion: String by lazy { libs.findVersion("graalVmJdkVersion").get().toString() } val isGraal22: Boolean by lazy {
version.startsWith("22")
}
val arch by lazy {
if (os.isMacOsX && isGraal22) {
"amd64"
} else {
self.arch
}
}
val osName: String by lazy { val osName: String by lazy {
when { when {
os.isMacOsX && isGraal22 -> "darwin"
os.isMacOsX -> "macos" os.isMacOsX -> "macos"
os.isLinux -> "linux" os.isLinux -> "linux"
os.isWindows -> "windows"
else -> throw RuntimeException("${os.familyName} is not supported.") else -> throw RuntimeException("${os.familyName} is not supported.")
} }
} }
val baseName: String by lazy { "graalvm-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin" } val baseName: String by lazy {
if (graalVm.isGraal22) {
"graalvm-ce-java11-${osName}-${arch}-${version}"
} else {
"graalvm-jdk-${graalVM23JdkVersion}_${osName}-${arch}_bin"
}
}
val graalVM23JdkVersion: String by lazy {
libs.findVersion("graalVM23JdkVersion").get().requiredVersion
}
val downloadUrl: String by lazy { val downloadUrl: String by lazy {
val jdkMajor = graalVmJdkVersion.takeWhile { it != '.' } if (isGraal22) {
val extension = if (os.isWindows) "zip" else "tar.gz" "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-" +
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.$extension" "${version}/$baseName.tar.gz"
} else {
val jdkMajor = graalVM23JdkVersion.takeWhile { it != '.' }
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.tar.gz"
}
} }
val downloadFile: File by lazy { val installDir: File by lazy {
val extension = if (os.isWindows) "zip" else "tar.gz" File(homeDir, baseName)
File(homeDir, "${baseName}.$extension")
} }
val installDir: File by lazy { File(homeDir, baseName) }
val baseDir: String by lazy { val baseDir: String by lazy {
if (os.isMacOsX) "$installDir/Contents/Home" else installDir.toString() if (os.isMacOsX) "$installDir/Contents/Home" else installDir.toString()
} }
} }
/** Same logic as [org.gradle.internal.os.OperatingSystem#arch], which is protected. */ /**
* Same logic as [org.gradle.internal.os.OperatingSystem#arch], which is protected.
*/
val arch: String by lazy { val arch: String by lazy {
when (val arch = System.getProperty("os.arch")) { when (val arch = System.getProperty("os.arch")) {
"x86" -> "i386" "x86" -> "i386"
@@ -117,226 +85,14 @@ open class BuildInfo(private val project: Project) {
} }
} }
val graalVmAarch64: GraalVm = GraalVm("aarch64") val graalVm: GraalVm = GraalVm()
val graalVmAmd64: GraalVm = GraalVm("x64") val isCiBuild: Boolean by lazy {
System.getenv("CI") != null
val isCiBuild: Boolean by lazy { System.getenv("CI") != null }
val isReleaseBuild: Boolean by lazy { java.lang.Boolean.getBoolean("releaseBuild") }
val isNativeArch: Boolean by lazy { java.lang.Boolean.getBoolean("nativeArch") }
val jvmTarget: Int by lazy {
System.getProperty("pklJvmTarget")?.toInt() ?: PKL_JVM_TARGET_DEFAULT_MAXIMUM
} }
// JPMS exports for Truffle; needed on some versions of Java, and transitively within some JARs. val isReleaseBuild: Boolean by lazy {
private val jpmsExports = java.lang.Boolean.getBoolean("releaseBuild")
arrayOf(
"org.graalvm.truffle/com.oracle.truffle.api.exception=ALL-UNNAMED",
"org.graalvm.truffle/com.oracle.truffle.api=ALL-UNNAMED",
"org.graalvm.truffle/com.oracle.truffle.api.nodes=ALL-UNNAMED",
"org.graalvm.truffle/com.oracle.truffle.api.source=ALL-UNNAMED",
)
// Extra JPMS modules forced onto the module path via `--add-modules` in some cases.
private val jpmsAddModules = arrayOf("jdk.unsupported")
// Formats `jpmsExports` for use in JAR manifest attributes.
val jpmsExportsForJarManifest: String by lazy {
jpmsExports.joinToString(" ") { it.substringBefore("=") }
}
// Formats `jpmsExports` for use on the command line with `--add-exports`.
val jpmsExportsForAddExportsFlags: Collection<String> by lazy {
jpmsExports.map { "--add-exports=$it" }
}
// Formats `jpmsAddModules` for use on the command line with `--add-modules`.
val jpmsAddModulesFlags: Collection<String> by lazy { jpmsAddModules.map { "--add-modules=$it" } }
// JVM properties to set during testing.
val testProperties =
mapOf<String, Any>(
// @TODO: this should be removed once pkl supports JPMS as a true Java Module.
"polyglotimpl.DisableClassPathIsolation" to true
)
val jdkVendor: JvmVendorSpec = JvmVendorSpec.ADOPTIUM
val jdkToolchainVersion: JavaLanguageVersion by lazy {
JavaLanguageVersion.of(System.getProperty("pklJdkToolchain")?.toInt() ?: PKL_JDK_VERSION_MIN)
}
val jdkTestFloor: JavaLanguageVersion by lazy { JavaLanguageVersion.of(PKL_TEST_JDK_MINIMUM) }
val jdkTestCeiling: JavaLanguageVersion by lazy { JavaLanguageVersion.of(PKL_TEST_JDK_MAXIMUM) }
val testAllJdks: Boolean by lazy {
// By default, Pkl is tested against LTS JDK releases within the bounds of `PKL_TEST_JDK_TARGET`
// and `PKL_TEST_JDK_MAXIMUM`. To test against the full suite of JDK versions, past and present,
// set `-DpklTestAllJdks=true` on the Gradle command line. This results in non-LTS releases, old
// releases, and "experimental releases" (newer than the toolchain version) being included in
// the default `check` suite.
System.getProperty("pklTestAllJdks")?.toBoolean() ?: PKL_TEST_ALL_JDKS
}
val testExperimentalJdks: Boolean by lazy {
System.getProperty("pklTestFutureJdks")?.toBoolean() ?: false
}
val testJdkVendors: Sequence<JvmVendorSpec> by lazy {
// By default, only OpenJDK is tested during multi-JDK testing. Flip `-DpklTestAllVendors=true`
// to additionally test against a suite of JDK vendors, including Azul, Oracle, and GraalVM.
when (System.getProperty("pklTestAllVendors")?.toBoolean()) {
true -> sequenceOf(JvmVendorSpec.ADOPTIUM, JvmVendorSpec.GRAAL_VM, JvmVendorSpec.ORACLE)
else -> sequenceOf(JvmVendorSpec.ADOPTIUM)
}
}
// Assembles a collection of JDK versions which tests can be run against, considering ancillary
// parameters like `testAllJdks` and `testExperimentalJdks`.
val jdkTestRange: Collection<JavaLanguageVersion> by lazy {
JavaVersionRange.inclusive(jdkTestFloor, jdkTestCeiling).filter { version ->
// unless we are instructed to test all JDKs, tests only include LTS releases and
// versions above the toolchain version.
testAllJdks || (JavaVersionRange.isLTS(version) || version >= jdkToolchainVersion)
}
}
private fun JavaToolchainSpec.pklJdkToolchain() {
languageVersion.set(jdkToolchainVersion)
vendor.set(jdkVendor)
}
private fun labelForVendor(vendor: JvmVendorSpec): String =
when (vendor) {
JvmVendorSpec.AZUL -> "Zulu"
JvmVendorSpec.GRAAL_VM -> "GraalVm"
JvmVendorSpec.ORACLE -> "Oracle"
JvmVendorSpec.ADOPTIUM -> "Adoptium"
else -> error("Unrecognized JDK vendor: $vendor")
}
private fun testNamer(baseName: () -> String): (JavaLanguageVersion, JvmVendorSpec?) -> String =
{ jdkTarget, vendor ->
val targetToken =
when (vendor) {
null -> "Jdk${jdkTarget.asInt()}"
else -> "Jdk${jdkTarget.asInt()}${labelForVendor(vendor).capitalized()}"
}
if (jdkTarget > jdkToolchainVersion) {
// test targets above the toolchain target are considered "experimental".
"${baseName()}${targetToken}Experimental"
} else {
"${baseName()}${targetToken}"
}
}
@Suppress("UnstableApiUsage")
fun multiJdkTestingWith(
templateTask: TaskProvider<out Test>,
configurator: MultiJdkTestConfigurator = {},
): Iterable<Provider<out Any>> =
with(project) {
// force the `jvm-test-suite` plugin to apply first
project.pluginManager.apply(JvmTestSuitePlugin::class.java)
val isMultiVendor = testJdkVendors.count() > 1
val baseNameProvider = { templateTask.get().name }
val namer = testNamer(baseNameProvider)
val applyConfig: MultiJdkTestConfigurator = { (version, jdk) ->
// 1) copy configurations from the template task
dependsOn(templateTask)
templateTask.get().let { template ->
classpath = template.classpath
testClassesDirs = template.testClassesDirs
jvmArgs.addAll(template.jvmArgs)
jvmArgumentProviders.addAll(template.jvmArgumentProviders)
forkEvery = template.forkEvery
maxParallelForks = template.maxParallelForks
minHeapSize = template.minHeapSize
maxHeapSize = template.maxHeapSize
exclude(template.excludes)
template.systemProperties.forEach { prop -> systemProperty(prop.key, prop.value) }
}
// 2) assign launcher
javaLauncher = jdk
// 3) dispatch the user's configurator
configurator(version to jdk)
}
serviceOf<JavaToolchainService>().let { toolchains ->
jdkTestRange
.flatMap { targetVersion ->
// multiply out by jdk vendor
testJdkVendors.map { vendor -> (targetVersion to vendor) }
}
.filter { (jdkTarget, vendor) ->
// only include experimental tasks in the return suite if the flag is set. if the task
// is withheld from the returned list, it will not be executed by default with `gradle
// check`.
testExperimentalJdks ||
(!namer(jdkTarget, vendor.takeIf { isMultiVendor }).contains("Experimental"))
}
.map { (jdkTarget, vendor) ->
if (jdkToolchainVersion == jdkTarget)
tasks.register(namer(jdkTarget, vendor)) {
// alias to `test`
dependsOn(templateTask)
group = Category.VERIFICATION
description =
"Alias for regular '${baseNameProvider()}' task, on JDK ${jdkTarget.asInt()}"
}
else
the<TestingExtension>().suites.register(
namer(jdkTarget, vendor.takeIf { isMultiVendor }),
JvmTestSuite::class,
) {
targets.all {
testTask.configure {
group = Category.VERIFICATION
description = "Run tests against JDK ${jdkTarget.asInt()}"
applyConfig(jdkTarget to toolchains.launcherFor { languageVersion = jdkTarget })
// fix: on jdk17, we must force the polyglot module on to the modulepath
if (jdkTarget.asInt() == 17)
jvmArgumentProviders.add(
CommandLineArgumentProvider {
buildList { listOf("--add-modules=org.graalvm.polyglot") }
}
)
}
}
}
}
.toList()
}
}
val javaCompiler: Provider<JavaCompiler> by lazy {
project.serviceOf<JavaToolchainService>().let { toolchainService ->
toolchainService.compilerFor { pklJdkToolchain() }
}
}
val javaTestLauncher: Provider<JavaLauncher> by lazy {
project.serviceOf<JavaToolchainService>().let { toolchainService ->
toolchainService.launcherFor { pklJdkToolchain() }
}
}
val multiJdkTesting: Boolean by lazy {
// By default, Pkl is tested against a full range of JDK versions, past and present, within the
// supported bounds of `PKL_TEST_JDK_TARGET` and `PKL_TEST_JDK_MAXIMUM`. To opt-out of this
// behavior, set `-DpklMultiJdkTesting=false` on the Gradle command line.
//
// In CI, this defaults to `true` to catch potential cross-JDK compat regressions or other bugs.
// In local dev, this defaults to `false` to speed up the build and reduce contributor load.
System.getProperty("pklMultiJdkTesting")?.toBoolean() ?: isCiBuild
} }
val hasMuslToolchain: Boolean by lazy { val hasMuslToolchain: Boolean by lazy {
@@ -350,25 +106,19 @@ open class BuildInfo(private val project: Project) {
// could be `commitId: Provider<String> = project.provider { ... }` // could be `commitId: Provider<String> = project.provider { ... }`
val commitId: String by lazy { val commitId: String by lazy {
// allow -DcommitId=abc123 for build environments that don't have git.
System.getProperty("commitId").let { if (it != null) return@lazy it }
// only run command once per build invocation // only run command once per build invocation
if (project === project.rootProject) { if (project === project.rootProject) {
val process = Runtime.getRuntime()
ProcessBuilder() .exec("git rev-parse --short HEAD", arrayOf(), project.rootDir)
.command("git", "rev-parse", "--short", "HEAD") .inputStream.reader().readText().trim()
.directory(project.rootDir)
.start()
process.waitFor().also { exitCode ->
if (exitCode == -1) throw RuntimeException(process.errorStream.reader().readText())
}
process.inputStream.reader().readText().trim()
} else { } else {
project.rootProject.extensions.getByType(BuildInfo::class.java).commitId project.rootProject.extensions.getByType(BuildInfo::class.java).commitId
} }
} }
val commitish: String by lazy { if (isReleaseBuild) project.version.toString() else commitId } val commitish: String by lazy {
if (isReleaseBuild) project.version.toString() else commitId
}
val pklVersion: String by lazy { val pklVersion: String by lazy {
if (isReleaseBuild) { if (isReleaseBuild) {
@@ -397,7 +147,3 @@ open class BuildInfo(private val project: Project) {
} }
} }
} }
// Shape of a function which is applied to configure multi-JDK testing.
private typealias MultiJdkTestConfigurator =
Test.(Pair<JavaLanguageVersion, Provider<JavaLauncher>>) -> Unit
+17 -42
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFileProperty import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty import org.gradle.api.provider.ListProperty
@@ -20,47 +5,37 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.listProperty
/** /**
* Builds a self-contained Pkl CLI Jar that is directly executable on Windows, macOS, and Linux. * Builds a self-contained Pkl CLI Jar that is directly executable on *nix
* and executable with `java -jar` on Windows.
* *
* For direct execution, the `java` command must be on the PATH. * For direct execution, the `java` command must be on the PATH.
* *
* Technique borrowed from [Mill](https://mill-build.org/blog/5-executable-jars.html). * https://skife.org/java/unix/2011/06/20/really_executable_jars.html
*/ */
abstract class ExecutableJar : DefaultTask() { open class ExecutableJar : DefaultTask() {
@get:InputFile abstract val inJar: RegularFileProperty @get:InputFile
val inJar: RegularFileProperty = project.objects.fileProperty()
@get:OutputFile abstract val outJar: RegularFileProperty @get:OutputFile
val outJar: RegularFileProperty = project.objects.fileProperty()
@get:Input abstract val jvmArgs: ListProperty<String> @get:Input
val jvmArgs: ListProperty<String> = project.objects.listProperty()
@TaskAction @TaskAction
fun buildJar() { fun buildJar() {
val inFile = inJar.get().asFile val inFile = inJar.get().asFile
val outFile = outJar.get().asFile val outFile = outJar.get().asFile
val escapedJvmArgs = jvmArgs.get().joinToString(separator = " ") { "\"$it\"" } val escapedJvmArgs = jvmArgs.get().joinToString(separator = " ") { "\"$it\"" }
val unixStartScript =
""" val startScript = """
@ 2>/dev/null # 2>nul & echo off & goto BOF #!/bin/sh
: exec java $escapedJvmArgs -jar $0 "$@"
exec java $escapedJvmArgs -jar "$0" "$@" """.trim().trimMargin() + "\n\n\n"
exit
"""
.trimIndent()
val windowsStartScript =
"""
:BOF
setlocal
@echo off
java $escapedJvmArgs -jar "%~dpnx0" %*
endlocal
exit /B %errorlevel%
"""
.trimIndent()
// need crlf endings for Windows portion of script
.replace("\n", "\r\n")
val startScript = unixStartScript + "\r\n" + windowsStartScript + "\r\n".repeat(3)
outFile.outputStream().use { outStream -> outFile.outputStream().use { outStream ->
startScript.byteInputStream().use { it.copyTo(outStream) } startScript.byteInputStream().use { it.copyTo(outStream) }
inFile.inputStream().use { it.copyTo(outStream) } inFile.inputStream().use { it.copyTo(outStream) }
@@ -1,18 +1,3 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
open class GradlePluginTests { open class GradlePluginTests {
+10 -30
View File
@@ -1,21 +1,6 @@
/* import java.net.URL
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import groovy.json.JsonSlurper
import java.net.URI
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import groovy.json.JsonSlurper
@Suppress("unused") @Suppress("unused")
class GradleVersionInfo(json: Map<String, Any>) { class GradleVersionInfo(json: Map<String, Any>) {
@@ -53,36 +38,31 @@ class GradleVersionInfo(json: Map<String, Any>) {
val wrapperChecksumUrl: String by json val wrapperChecksumUrl: String by json
companion object { companion object {
private fun fetchAll(): List<GradleVersionInfo> = private fun fetchAll(): List<GradleVersionInfo> = fetchMultiple("https://services.gradle.org/versions/all")
fetchMultiple("https://services.gradle.org/versions/all")
fun fetchReleases(): List<GradleVersionInfo> = fetchAll().filter { it.isReleaseVersion } fun fetchReleases(): List<GradleVersionInfo> = fetchAll().filter { it.isReleaseVersion }
fun fetchCurrent(): GradleVersionInfo = fun fetchCurrent(): GradleVersionInfo = fetchSingle("https://services.gradle.org/versions/current")
fetchSingle("https://services.gradle.org/versions/current")
fun fetchRc(): GradleVersionInfo? = fun fetchRc(): GradleVersionInfo? = fetchSingleOrNull("https://services.gradle.org/versions/release-candidate")
fetchSingleOrNull("https://services.gradle.org/versions/release-candidate")
fun fetchNightly(): GradleVersionInfo = fun fetchNightly(): GradleVersionInfo = fetchSingle("https://services.gradle.org/versions/nightly")
fetchSingle("https://services.gradle.org/versions/nightly")
private fun fetchSingle(url: String): GradleVersionInfo { private fun fetchSingle(url: String): GradleVersionInfo {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return GradleVersionInfo(JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>) return GradleVersionInfo(JsonSlurper().parse(URL(url)) as Map<String, Any>)
} }
private fun fetchSingleOrNull(url: String): GradleVersionInfo? { private fun fetchSingleOrNull(url: String): GradleVersionInfo? {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val json = JsonSlurper().parse(URI(url).toURL()) as Map<String, Any> val json = JsonSlurper().parse(URL(url)) as Map<String, Any>
return if (json.isEmpty()) null else GradleVersionInfo(json) return if (json.isEmpty()) null else GradleVersionInfo(json)
} }
private fun fetchMultiple(url: String): List<GradleVersionInfo> { private fun fetchMultiple(url: String): List<GradleVersionInfo> {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return (JsonSlurper().parse(URI(url).toURL()) as List<Map<String, Any>>).map { return (JsonSlurper().parse(URL(url)) as List<Map<String, Any>>)
GradleVersionInfo(it) .map { GradleVersionInfo(it) }
}
} }
} }
} }
-15
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
@@ -1,91 +0,0 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
import java.util.*
import javax.inject.Inject
import kotlin.io.path.createDirectories
import org.gradle.api.DefaultTask
import org.gradle.api.internal.file.FileOperations
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
abstract class InstallGraalVm
@Inject
constructor(
private val fileOperations: FileOperations,
private val execOperations: ExecOperations,
) : DefaultTask() {
@get:Input abstract val graalVm: Property<BuildInfo.GraalVm>
init {
@Suppress("LeakingThis") onlyIf("GraalVM not installed") { !graalVm.get().installDir.exists() }
}
@TaskAction
@Suppress("unused")
fun run() {
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
val distroDir = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())
try {
distroDir.createDirectories()
println("Extracting ${graalVm.get().downloadFile} into $distroDir")
// faster and more reliable than Gradle's `copy { from tarTree() }`
execOperations.exec {
workingDir = distroDir.toFile()
executable = "tar"
args("--strip-components=1", "-xzf", graalVm.get().downloadFile)
}
val os = org.gradle.internal.os.OperatingSystem.current()
val distroBinDir =
if (os.isMacOsX) distroDir.resolve("Contents/Home/bin") else distroDir.resolve("bin")
println("Installing native-image into $distroDir")
val gvmVersionMajor =
requireNotNull(graalVm.get().version.split(".").first().toIntOrNull()) {
"Invalid GraalVM JDK version: ${graalVm.get().graalVmJdkVersion}"
}
if (gvmVersionMajor < 24) {
execOperations.exec {
val executableName = if (os.isWindows) "gu.cmd" else "gu"
executable = distroBinDir.resolve(executableName).toString()
args("install", "--no-progress", "native-image")
}
}
println("Creating symlink ${graalVm.get().installDir} for $distroDir")
val tempLink = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())
Files.createSymbolicLink(tempLink, distroDir)
try {
Files.move(tempLink, graalVm.get().installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
} catch (e: Exception) {
try {
fileOperations.delete(tempLink.toFile())
} catch (ignored: Exception) {}
throw e
}
} catch (e: Exception) {
try {
fileOperations.delete(distroDir)
} catch (ignored: Exception) {}
throw e
}
}
}
@@ -1,64 +0,0 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:Suppress("MemberVisibilityCanBePrivate")
import java.util.*
import org.gradle.jvm.toolchain.JavaLanguageVersion
typealias JavaVersionPair = Pair<JavaLanguageVersion, JavaLanguageVersion>
// All LTS releases.
private val ltsReleases =
sortedSetOf(
JavaLanguageVersion.of(8),
JavaLanguageVersion.of(11),
JavaLanguageVersion.of(17),
JavaLanguageVersion.of(21),
)
/** Describes an inclusive range of JVM versions, based on the [JavaLanguageVersion] type. */
@JvmInline
value class JavaVersionRange private constructor(private val bounds: JavaVersionPair) :
Iterable<JavaLanguageVersion> {
@Suppress("unused")
companion object {
fun isLTS(version: JavaLanguageVersion): Boolean = version in ltsReleases
fun inclusive(floor: JavaLanguageVersion, ceiling: JavaLanguageVersion): JavaVersionRange =
JavaVersionRange(floor to ceiling)
fun startingAt(floor: JavaLanguageVersion): JavaVersionRange =
inclusive(floor, JavaLanguageVersion.of(PKL_TEST_JDK_MAXIMUM))
fun upTo(ceiling: JavaLanguageVersion): JavaVersionRange =
inclusive(JavaLanguageVersion.of(PKL_TEST_JDK_MINIMUM), ceiling)
}
operator fun contains(version: JavaLanguageVersion): Boolean =
version >= bounds.first && version <= bounds.second
fun asSequence(): Sequence<JavaLanguageVersion> = sequence {
var current = bounds.first
while (current <= bounds.second) {
yield(current)
current = JavaLanguageVersion.of(current.asInt() + 1)
}
}
fun asSortedSet(): SortedSet<JavaLanguageVersion> = asSequence().toSortedSet()
override fun iterator(): Iterator<JavaLanguageVersion> = asSortedSet().iterator()
}
+12 -27
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.File import java.io.File
import java.util.regex.Matcher import java.util.regex.Matcher
import java.util.regex.Pattern import java.util.regex.Pattern
@@ -30,18 +15,21 @@ import org.gradle.kotlin.dsl.listProperty
import org.gradle.kotlin.dsl.mapProperty import org.gradle.kotlin.dsl.mapProperty
open class MergeSourcesJars : DefaultTask() { open class MergeSourcesJars : DefaultTask() {
@get:InputFiles val inputJars: ConfigurableFileCollection = project.objects.fileCollection() @get:InputFiles
val inputJars: ConfigurableFileCollection = project.objects.fileCollection()
@get:InputFiles @get:InputFiles
val mergedBinaryJars: ConfigurableFileCollection = project.objects.fileCollection() val mergedBinaryJars: ConfigurableFileCollection = project.objects.fileCollection()
@get:Input val relocatedPackages: MapProperty<String, String> = project.objects.mapProperty() @get:Input
val relocatedPackages: MapProperty<String, String> = project.objects.mapProperty()
@get:Input @get:Input
var sourceFileExtensions: ListProperty<String> = var sourceFileExtensions: ListProperty<String> = project.objects.listProperty<String>()
project.objects.listProperty<String>().convention(listOf(".java", ".kt")) .convention(listOf(".java", ".kt"))
@get:OutputFile val outputJar: RegularFileProperty = project.objects.fileProperty() @get:OutputFile
val outputJar: RegularFileProperty = project.objects.fileProperty()
@TaskAction @TaskAction
@Suppress("unused") @Suppress("unused")
@@ -50,15 +38,12 @@ open class MergeSourcesJars : DefaultTask() {
val relocatedPkgs = relocatedPackages.get() val relocatedPkgs = relocatedPackages.get()
val relocatedPaths = val relocatedPaths = relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }
relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }
// use negative lookbehind to match any that don't precede with // use negative lookbehind to match any that don't precede with
// a word or a period character. should catch most cases. // a word or a period character. should catch most cases.
val importPattern = val importPattern = Pattern.compile("(?<!(\\w|\\.))(" +
Pattern.compile( relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")")
"(?<!(\\w|\\.))(" + relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")"
)
val sourceFileExts = sourceFileExtensions.get() val sourceFileExts = sourceFileExtensions.get()
@@ -111,7 +96,7 @@ open class MergeSourcesJars : DefaultTask() {
relocatedPkgs: Map<String, String>, relocatedPkgs: Map<String, String>,
details: FileVisitDetails, details: FileVisitDetails,
sourceText: String, sourceText: String,
importPattern: Pattern, importPattern: Pattern
): String { ): String {
val matcher = importPattern.matcher(sourceText) val matcher = importPattern.matcher(sourceText)
val buffer = StringBuffer() val buffer = StringBuffer()
+7 -24
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.result.ResolvedArtifactResult import org.gradle.api.artifacts.result.ResolvedArtifactResult
@@ -27,27 +12,25 @@ import org.gradle.kotlin.dsl.property
import org.gradle.language.base.artifact.SourcesArtifact import org.gradle.language.base.artifact.SourcesArtifact
open class ResolveSourcesJars : DefaultTask() { open class ResolveSourcesJars : DefaultTask() {
@get:InputFiles val configuration: Property<Configuration> = project.objects.property() @get:InputFiles
val configuration: Property<Configuration> = project.objects.property()
@get:OutputDirectory val outputDir: DirectoryProperty = project.objects.directoryProperty() @get:OutputDirectory
val outputDir: DirectoryProperty = project.objects.directoryProperty()
@TaskAction @TaskAction
@Suppress("UnstableApiUsage", "unused") @Suppress("UnstableApiUsage", "unused")
fun resolve() { fun resolve() {
val componentIds = val componentIds = configuration.get().incoming.resolutionResult.allDependencies.map {
configuration.get().incoming.resolutionResult.allDependencies.map {
(it as ResolvedDependencyResult).selected.id (it as ResolvedDependencyResult).selected.id
} }
val resolutionResult = val resolutionResult = project.dependencies.createArtifactResolutionQuery()
project.dependencies
.createArtifactResolutionQuery()
.forComponents(componentIds) .forComponents(componentIds)
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java) .withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)
.execute() .execute()
val resolvedJars = val resolvedJars = resolutionResult.resolvedComponents
resolutionResult.resolvedComponents
.flatMap { it.getArtifacts(SourcesArtifact::class.java) } .flatMap { it.getArtifacts(SourcesArtifact::class.java) }
.map { (it as ResolvedArtifactResult).file } .map { (it as ResolvedArtifactResult).file }
@@ -1,28 +1,10 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.diffplug.gradle.spotless.KotlinGradleExtension
import org.gradle.accessors.dm.LibrariesForLibs
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { id("com.diffplug.spotless") }
val buildInfo = extensions.create<BuildInfo>("buildInfo", project) val buildInfo = extensions.create<BuildInfo>("buildInfo", project)
dependencyLocking { lockAllConfigurations() } dependencyLocking {
lockAllConfigurations()
}
configurations { configurations {
val rejectedVersionSuffix = Regex("-alpha|-beta|-eap|-m|-rc|-snapshot", RegexOption.IGNORE_CASE) val rejectedVersionSuffix = Regex("-alpha|-beta|-eap|-m|-rc|-snapshot", RegexOption.IGNORE_CASE)
@@ -31,10 +13,8 @@ configurations {
componentSelection { componentSelection {
all { all {
if (rejectedVersionSuffix.containsMatchIn(candidate.version)) { if (rejectedVersionSuffix.containsMatchIn(candidate.version)) {
reject( reject("Rejected dependency $candidate " +
"Rejected dependency $candidate " + "because it has a prelease version suffix matching `$rejectedVersionSuffix`.")
"because it has a prelease version suffix matching `$rejectedVersionSuffix`."
)
} }
} }
} }
@@ -42,36 +22,38 @@ configurations {
} }
} }
configurations.all {
resolutionStrategy.eachDependency {
if (requested.group == "org.jetbrains.kotlin") {
// prevent transitive deps from bumping Koltin version
useVersion(libs.versions.kotlin.get())
}
}
}
plugins.withType(JavaPlugin::class).configureEach { plugins.withType(JavaPlugin::class).configureEach {
val java = project.extensions.getByType<JavaPluginExtension>() val java = project.extensions.getByType<JavaPluginExtension>()
java.sourceCompatibility = JavaVersion.VERSION_17 java.sourceCompatibility = JavaVersion.VERSION_11
java.targetCompatibility = JavaVersion.VERSION_17 java.targetCompatibility = JavaVersion.VERSION_11
} }
tasks.withType<KotlinCompile>().configureEach { tasks.withType<KotlinCompile>().configureEach {
compilerOptions { kotlinOptions {
jvmTarget = JvmTarget.JVM_17 jvmTarget = "11"
freeCompilerArgs.addAll("-Xjsr305=strict", "-Xjvm-default=all") freeCompilerArgs = freeCompilerArgs + listOf("-Xjsr305=strict", "-Xjvm-default=all")
} }
} }
plugins.withType(IdeaPlugin::class).configureEach { plugins.withType(IdeaPlugin::class).configureEach {
val errorMessage = val errorMessage = "Use IntelliJ Gradle import instead of running the `idea` task. See README for more information."
"Use IntelliJ Gradle import instead of running the `idea` task. See README for more information."
tasks.named("idea") { doFirst { throw GradleException(errorMessage) } } tasks.named("idea") {
tasks.named("ideaModule") { doFirst { throw GradleException(errorMessage) } } doFirst {
throw GradleException(errorMessage)
}
}
tasks.named("ideaModule") {
doFirst {
throw GradleException(errorMessage)
}
}
if (project == rootProject) { if (project == rootProject) {
tasks.named("ideaProject") { doFirst { throw GradleException(errorMessage) } } tasks.named("ideaProject") {
doFirst {
throw GradleException(errorMessage)
}
}
} }
} }
@@ -90,7 +72,11 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
// dependency versions in generated POMs // dependency versions in generated POMs
publications { publications {
withType(MavenPublication::class.java) { withType(MavenPublication::class.java) {
versionMapping { allVariants { fromResolutionResult() } } versionMapping {
allVariants {
fromResolutionResult()
}
}
} }
} }
} }
@@ -98,72 +84,12 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
// settings.gradle.kts sets `--write-locks` // settings.gradle.kts sets `--write-locks`
// if Gradle command line contains this task name // if Gradle command line contains this task name
val updateDependencyLocks by val updateDependencyLocks by tasks.registering {
tasks.registering { doLast {
doLast { configurations.filter { it.isCanBeResolved }.forEach { it.resolve() } } configurations
.filter { it.isCanBeResolved }
.forEach { it.resolve() }
} }
}
val allDependencies by tasks.registering(DependencyReportTask::class) val allDependencies by tasks.registering(DependencyReportTask::class)
tasks.withType(Test::class).configureEach {
System.getProperty("testReportsDir")?.let { reportsDir ->
reports.junitXml.outputLocation.set(file(reportsDir).resolve(project.name).resolve(name))
}
debugOptions {
enabled = System.getProperty("jvmdebug")?.toBoolean() ?: false
@Suppress("UnstableApiUsage")
host = "*"
port = 5005
suspend = true
server = true
}
}
tasks.withType(JavaExec::class).configureEach {
debugOptions {
enabled = System.getProperty("jvmdebug")?.toBoolean() ?: false
@Suppress("UnstableApiUsage")
host = "*"
port = 5005
suspend = true
server = true
}
}
// Version Catalog library symbols.
private val libs = the<LibrariesForLibs>()
private val licenseHeaderFile by lazy {
rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt")
}
private fun KotlinGradleExtension.configureFormatter() {
ktfmt(libs.versions.ktfmt.get()).googleStyle()
licenseHeaderFile(licenseHeaderFile, "([a-zA-Z]|@file|//)")
}
val originalRemoteName = System.getenv("PKL_ORIGINAL_REMOTE_NAME") ?: "origin"
spotless {
ratchetFrom = "$originalRemoteName/main"
// When building root project, format buildSrc files too.
// We need this because buildSrc is not a subproject of the root project, so a top-level
// `spotlessApply` will not trigger `buildSrc:spotlessApply`.
if (project === rootProject) {
kotlinGradle {
configureFormatter()
target("*.kts", "buildSrc/*.kts", "buildSrc/src/*/kotlin/**/*.kts")
}
kotlin {
ktfmt(libs.versions.ktfmt.get()).googleStyle()
target("buildSrc/src/*/kotlin/**/*.kt")
licenseHeaderFile(licenseHeaderFile)
}
} else {
kotlinGradle {
configureFormatter()
target("*.kts")
}
}
}
+51 -93
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.GradleException import org.gradle.api.GradleException
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.component.AdhocComponentWithVariants import org.gradle.api.component.AdhocComponentWithVariants
@@ -33,29 +18,29 @@ val fatJarConfiguration: Configuration = configurations.create("fatJar")
val fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>("fatJar") val fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>("fatJar")
// ideally we'd configure this automatically based on project dependencies // ideally we'd configure this automatically based on project dependencies
val firstPartySourcesJarsConfiguration: Configuration = val firstPartySourcesJarsConfiguration: Configuration = configurations.create("firstPartySourcesJars")
configurations.create("firstPartySourcesJars")
val relocations = val relocations = mapOf(
mapOf(
// pkl-core dependencies // pkl-core dependencies
"org.antlr.v4." to "org.pkl.thirdparty.antlr.v4.",
// https://github.com/oracle/graal/issues/1644 has been fixed,
// but native-image still fails when shading com.oracle.truffle
//"com.oracle.truffle" to "org.pkl.thirdparty.truffle",
"org.graalvm." to "org.pkl.thirdparty.graalvm.",
"org.organicdesign.fp." to "org.pkl.thirdparty.paguro.", "org.organicdesign.fp." to "org.pkl.thirdparty.paguro.",
"org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.", "org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
"org.msgpack." to "org.pkl.thirdparty.msgpack.", "org.msgpack." to "org.pkl.thirdparty.msgpack.",
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom.", "org.w3c.dom." to "org.pkl.thirdparty.w3c.dom",
"com.oracle.svm.core." to "org.pkl.thirdparty.svm.", "com.oracle.svm.core." to "org.pkl.thirdparty.svm.",
// pkl-cli dependencies // pkl-cli dependencies
"org.jline." to "org.pkl.thirdparty.jline.", "org.jline." to "org.pkl.thirdparty.jline.",
"com.github.ajalt.clikt." to "org.pkl.thirdparty.clikt.", "com.github.ajalt.clikt." to "org.pkl.thirdparty.clikt.",
"com.github.ajalt.colormath." to "org.pkl.thirdparty.colormath.",
"com.github.ajalt.mordant." to "org.pkl.thirdparty.mordant.",
"com.sun.jna." to "org.pkl.thirdparty.jna.",
"kotlin." to "org.pkl.thirdparty.kotlin.", "kotlin." to "org.pkl.thirdparty.kotlin.",
"kotlinx." to "org.pkl.thirdparty.kotlinx.", "kotlinx." to "org.pkl.thirdparty.kotlinx.",
"org.intellij." to "org.pkl.thirdparty.intellij.", "org.intellij." to "org.pkl.thirdparty.intellij.",
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi.", "org.fusesource.jansi." to "org.pkl.thirdparty.jansi",
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni.", "org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni",
// pkl-doc dependencies // pkl-doc dependencies
"org.commonmark." to "org.pkl.thirdparty.commonmark.", "org.commonmark." to "org.pkl.thirdparty.commonmark.",
@@ -65,26 +50,13 @@ val relocations =
"io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.", "io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.",
// pkl-codegen-java dependencies // pkl-codegen-java dependencies
"com.palantir.javapoet." to "org.pkl.thirdparty.javapoet.", "com.squareup.javapoet." to "org.pkl.thirdparty.javapoet.",
// pkl-codegen-kotlin dependencies // pkl-codegen-kotlin dependencies
"com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.", "com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.",
) )
for ((key, value) in relocations) { val nonRelocations = listOf("com/oracle/truffle/")
if (!key.endsWith(".")) {
throw GradleException(
"Invalid relocation `\"$key\" to \"$value\"`: `$key` should end with a dot"
)
}
if (!value.endsWith(".")) {
throw GradleException(
"Invalid relocation `\"$key\" to \"$value\"`: `$value` should end with a dot"
)
}
}
val nonRelocations = listOf("com/oracle/truffle/", "org/graalvm/")
tasks.shadowJar { tasks.shadowJar {
inputs.property("relocations", relocations) inputs.property("relocations", relocations)
@@ -93,28 +65,9 @@ tasks.shadowJar {
configurations = listOf(project.configurations.runtimeClasspath.get()) configurations = listOf(project.configurations.runtimeClasspath.get())
// not required at runtime / fat JARs can't be used in native-image builds anyway
exclude("org/pkl/cli/svm/**")
exclude("META-INF/maven/**") exclude("META-INF/maven/**")
exclude("META-INF/upgrade/**") exclude("META-INF/upgrade/**")
exclude("META-INF/versions/19/**")
val info = project.extensions.getByType<BuildInfo>()
val minimumJvmTarget = JavaVersion.toVersion(info.jvmTarget)
manifest.attributes(
// Certain exports need to be added to the Java modulepath for Java 17 to work properly with
// shaded JARs. See the following link for an explanation of this syntax:
// https://bugs.openjdk.org/browse/JDK-8335225
"Add-Exports" to info.jpmsExportsForJarManifest
)
// effectively, this results in calls excluding:
// `META-INF/versions/{18-25}/**`
// at the time of this writing; multi-release JARs beyond JDK 21 break the current
// version of the Shadow plugin, and aren't needed for Truffle's use by Pkl.
JavaVersionRange.startingAt(JavaLanguageVersion.of(minimumJvmTarget.majorVersion.toInt() + 1))
.forEach { exclude("META-INF/versions/${it.asInt()}/**") }
// org.antlr.v4.runtime.misc.RuleDependencyProcessor // org.antlr.v4.runtime.misc.RuleDependencyProcessor
exclude("META-INF/services/javax.annotation.processing.Processor") exclude("META-INF/services/javax.annotation.processing.Processor")
@@ -131,11 +84,12 @@ tasks.shadowJar {
// workaround for https://github.com/johnrengelman/shadow/issues/651 // workaround for https://github.com/johnrengelman/shadow/issues/651
components.withType(AdhocComponentWithVariants::class.java).forEach { c -> components.withType(AdhocComponentWithVariants::class.java).forEach { c ->
c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) { skip() } c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) {
skip()
}
} }
val testFatJar by val testFatJar by tasks.registering(Test::class) {
tasks.registering(Test::class) {
testClassesDirs = files(tasks.test.get().testClassesDirs) testClassesDirs = files(tasks.test.get().testClassesDirs)
classpath = classpath =
// compiled test classes // compiled test classes
@@ -146,13 +100,14 @@ val testFatJar by
// (test dependencies that are also main dependencies must already be contained in fat Jar; // (test dependencies that are also main dependencies must already be contained in fat Jar;
// to verify that, we don't want to include them here) // to verify that, we don't want to include them here)
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get()) (configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
} }
tasks.check { dependsOn(testFatJar) } tasks.check {
dependsOn(testFatJar)
}
val validateFatJar by val validateFatJar by tasks.registering {
tasks.registering { val outputFile = file("$buildDir/validateFatJar/result.txt")
val outputFile = layout.buildDirectory.file("validateFatJar/result.txt")
inputs.files(tasks.shadowJar) inputs.files(tasks.shadowJar)
inputs.property("nonRelocations", nonRelocations) inputs.property("nonRelocations", nonRelocations)
outputs.file(outputFile) outputs.file(outputFile)
@@ -162,50 +117,49 @@ val validateFatJar by
zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit { zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit {
val fileDetails = this val fileDetails = this
val path = fileDetails.relativePath.pathString val path = fileDetails.relativePath.pathString
if ( if (!(fileDetails.isDirectory ||
!(fileDetails.isDirectory ||
path.startsWith("org/pkl/") || path.startsWith("org/pkl/") ||
path.startsWith("META-INF/") || path.startsWith("META-INF/") ||
nonRelocations.any { path.startsWith(it) }) nonRelocations.any { path.startsWith(it) })) {
) {
// don't throw exception inside `visit` // don't throw exception inside `visit`
// as this gives a misleading "Could not expand ZIP" error message // as this gives a misleading "Could not expand ZIP" error message
unshadowedFiles.add(path) unshadowedFiles.add(path)
} }
} }
if (unshadowedFiles.isEmpty()) { if (unshadowedFiles.isEmpty()) {
outputFile.get().asFile.writeText("SUCCESS") outputFile.writeText("SUCCESS")
} else { } else {
outputFile.get().asFile.writeText("FAILURE") outputFile.writeText("FAILURE")
throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n")) throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n"))
} }
} }
} }
tasks.check {
dependsOn(validateFatJar)
}
tasks.check { dependsOn(validateFatJar) } val resolveSourcesJars by tasks.registering(ResolveSourcesJars::class) {
val resolveSourcesJars by
tasks.registering(ResolveSourcesJars::class) {
configuration.set(configurations.runtimeClasspath) configuration.set(configurations.runtimeClasspath)
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars")) outputDir.set(project.file("$buildDir/resolveSourcesJars"))
} }
val fatSourcesJar by val fatSourcesJar by tasks.registering(MergeSourcesJars::class) {
tasks.registering(MergeSourcesJars::class) { plugins.withId("pklJavaLibrary") {
plugins.withId("pklJavaLibrary") { inputJars.from(tasks.named("sourcesJar")) } inputJars.from(tasks.named("sourcesJar"))
}
inputJars.from(firstPartySourcesJarsConfiguration) inputJars.from(firstPartySourcesJarsConfiguration)
inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) }) inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
mergedBinaryJars.from(tasks.shadowJar) mergedBinaryJars.from(tasks.shadowJar)
relocatedPackages.set(relocations) relocatedPackages.set(relocations)
outputJar.fileProvider( outputJar.fileProvider(provider {
provider {
file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(".jar", "-sources.jar")) file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(".jar", "-sources.jar"))
} })
) }
}
artifacts { add("fatJar", tasks.shadowJar) } artifacts {
add("fatJar", tasks.shadowJar)
}
publishing { publishing {
publications { publications {
@@ -213,12 +167,16 @@ publishing {
project.shadow.component(this) project.shadow.component(this)
// sources Jar is fat // sources Jar is fat
artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) { classifier = "sources" } artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) {
classifier = "sources"
}
plugins.withId("pklJavaLibrary") { plugins.withId("pklJavaLibrary") {
val javadocJar by tasks.existing(Jar::class) val javadocJar by tasks.existing(Jar::class)
// Javadoc Jar is not fat (didn't invest effort) // Javadoc Jar is not fat (didn't invest effort)
artifact(javadocJar.flatMap { it.archiveFile }) { classifier = "javadoc" } artifact(javadocJar.flatMap { it.archiveFile }) {
classifier = "javadoc"
}
} }
} }
} }
+65 -54
View File
@@ -1,74 +1,85 @@
/* import java.nio.file.*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved. import java.util.UUID
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import de.undercouch.gradle.tasks.download.Download import de.undercouch.gradle.tasks.download.Download
import de.undercouch.gradle.tasks.download.Verify import de.undercouch.gradle.tasks.download.Verify
plugins { id("de.undercouch.download") } plugins {
id("de.undercouch.download")
}
val buildInfo = project.extensions.getByType<BuildInfo>() val buildInfo = project.extensions.getByType<BuildInfo>()
val homeDir = buildInfo.graalVm.homeDir
val baseName = buildInfo.graalVm.baseName
val installDir = buildInfo.graalVm.installDir
val downloadUrl = buildInfo.graalVm.downloadUrl
val downloadFile = file(homeDir).resolve("$baseName.tar.gz")
// tries to minimize chance of corruption by download-to-temp-file-and-move // tries to minimize chance of corruption by download-to-temp-file-and-move
val downloadGraalVmAarch64 by val downloadGraalVm by tasks.registering(Download::class) {
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAarch64) } onlyIf {
!installDir.exists()
}
val downloadGraalVmAmd64 by src(downloadUrl)
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAmd64) } dest(downloadFile)
fun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {
onlyIf { !graalvm.installDir.exists() }
doLast { println("Downloaded GraalVm to ${graalvm.downloadFile}") }
src(graalvm.downloadUrl)
dest(graalvm.downloadFile)
overwrite(false) overwrite(false)
tempAndMove(true) tempAndMove(true)
} }
val verifyGraalVmAarch64 by val verifyGraalVm by tasks.registering(Verify::class) {
tasks.registering(Verify::class) { onlyIf {
configureVerifyGraalVm(buildInfo.graalVmAarch64) !installDir.exists()
dependsOn(downloadGraalVmAarch64)
} }
val verifyGraalVmAmd64 by dependsOn(downloadGraalVm)
tasks.registering(Verify::class) { src(downloadFile)
configureVerifyGraalVm(buildInfo.graalVmAmd64) checksum(buildInfo.libs.findVersion("graalVmSha256-${buildInfo.graalVm.osName}-${buildInfo.graalVm.arch}").get().toString())
dependsOn(downloadGraalVmAmd64)
}
fun Verify.configureVerifyGraalVm(graalvm: BuildInfo.GraalVm) {
onlyIf { !graalvm.installDir.exists() }
src(graalvm.downloadFile)
checksum(
buildInfo.libs.findVersion("graalVmSha256-${graalvm.osName}-${graalvm.arch}").get().toString()
)
algorithm("SHA-256") algorithm("SHA-256")
} }
@Suppress("unused") // minimize chance of corruption by extract-to-random-dir-and-flip-symlink
val installGraalVmAarch64 by val installGraalVm by tasks.registering {
tasks.registering(InstallGraalVm::class) { dependsOn(verifyGraalVm)
dependsOn(verifyGraalVmAarch64)
graalVm = buildInfo.graalVmAarch64 onlyIf {
!installDir.exists()
} }
@Suppress("unused") doLast {
val installGraalVmAmd64 by val distroDir = "$homeDir/${UUID.randomUUID()}"
tasks.registering(InstallGraalVm::class) {
dependsOn(verifyGraalVmAmd64) try {
graalVm = buildInfo.graalVmAmd64 mkdir(distroDir)
println("Extracting $downloadFile into $distroDir")
// faster and more reliable than Gradle's `copy { from tarTree() }`
exec {
workingDir = file(distroDir)
executable = "tar"
args("--strip-components=1", "-xzf", downloadFile)
} }
val distroBinDir = if (buildInfo.os.isMacOsX) "$distroDir/Contents/Home/bin" else "$distroDir/bin"
println("Installing native-image into $distroDir")
exec {
executable = "$distroBinDir/gu"
args("install", "--no-progress", "native-image")
}
println("Creating symlink $installDir for $distroDir")
val tempLink = Paths.get("$homeDir/${UUID.randomUUID()}")
Files.createSymbolicLink(tempLink, Paths.get(distroDir))
try {
Files.move(tempLink, installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)
} catch (e: Exception) {
try { delete(tempLink.toFile()) } catch (ignored: Exception) {}
throw e
}
} catch (e: Exception) {
try { delete(distroDir) } catch (ignored: Exception) {}
throw e
}
}
}
@@ -1,19 +1,19 @@
/* /**
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved. * Allows to run Gradle plugin tests against different Gradle versions.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Adds a `compatibilityTestX` task for every Gradle version X
* you may not use this file except in compliance with the License. * between `ext.minSupportedGradleVersion` and `ext.maxSupportedGradleVersion`
* You may obtain a copy of the License at * that is not in `ext.gradleVersionsExcludedFromTesting`.
* * The list of available Gradle versions is obtained from services.gradle.org.
* https://www.apache.org/licenses/LICENSE-2.0 * Adds lifecycle tasks to test against multiple Gradle versions at once, for example all Gradle release versions.
* * Compatibility test tasks run the same tests and use the same task configuration as the project's `test` task.
* Unless required by applicable law or agreed to in writing, software * They set system properties for the Gradle version and distribution URL to be used.
* distributed under the License is distributed on an "AS IS" BASIS, * These properties are consumed by the `AbstractTest` class.
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ */
plugins { java }
plugins {
java
}
val gradlePluginTests = extensions.create<GradlePluginTests>("gradlePluginTests") val gradlePluginTests = extensions.create<GradlePluginTests>("gradlePluginTests")
@@ -24,26 +24,18 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
when (val taskNameSuffix = matchResult.groupValues[1]) { when (val taskNameSuffix = matchResult.groupValues[1]) {
"All" -> "All" ->
task("compatibilityTestAll") { task("compatibilityTestAll") {
dependsOn( dependsOn("compatibilityTestReleases", "compatibilityTestCandidate", "compatibilityTestNightly")
"compatibilityTestReleases",
"compatibilityTestCandidate",
"compatibilityTestNightly",
)
} }
// releases in configured range // releases in configured range
"Releases" -> "Releases" ->
task("compatibilityTestReleases") { task("compatibilityTestReleases") {
val versionInfos = GradleVersionInfo.fetchReleases() val versionInfos = GradleVersionInfo.fetchReleases()
val allVersions = val versionsToTestAgainst = versionInfos.filter { versionInfo ->
versionInfos
.filter { versionInfo ->
val v = versionInfo.gradleVersion val v = versionInfo.gradleVersion
!versionInfo.broken && !versionInfo.broken &&
v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion && v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion &&
v !in gradlePluginTests.skippedGradleVersions v !in gradlePluginTests.skippedGradleVersions
} }
.sortedBy { it.gradleVersion }
val versionsToTestAgainst = listOf(allVersions.first(), allVersions.last())
dependsOn(versionsToTestAgainst.map { createCompatibilityTestTask(it) }) dependsOn(versionsToTestAgainst.map { createCompatibilityTestTask(it) })
} }
@@ -53,10 +45,8 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
val versionInfo = GradleVersionInfo.fetchCurrent() val versionInfo = GradleVersionInfo.fetchCurrent()
if (versionInfo.version == gradle.gradleVersion) { if (versionInfo.version == gradle.gradleVersion) {
doLast { doLast {
println( println("No new Gradle release available. " +
"No new Gradle release available. " + "(Run `gradlew test` to test against ${versionInfo.version}.)")
"(Run `gradlew test` to test against ${versionInfo.version}.)"
)
} }
} else { } else {
dependsOn(createCompatibilityTestTask(versionInfo)) dependsOn(createCompatibilityTestTask(versionInfo))
@@ -69,7 +59,9 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
if (versionInfo?.activeRc == true) { if (versionInfo?.activeRc == true) {
dependsOn(createCompatibilityTestTask(versionInfo)) dependsOn(createCompatibilityTestTask(versionInfo))
} else { } else {
doLast { println("No active Gradle release candidate available.") } doLast {
println("No active Gradle release candidate available.")
}
} }
} }
// latest nightly // latest nightly
@@ -82,16 +74,16 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
else -> else ->
createCompatibilityTestTask( createCompatibilityTestTask(
taskNameSuffix, taskNameSuffix,
"https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip", "https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip"
) )
} }
} }
fun createCompatibilityTestTask(versionInfo: GradleVersionInfo): TaskProvider<Test> = fun createCompatibilityTestTask(versionInfo: GradleVersionInfo): Task =
createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl) createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl)
fun createCompatibilityTestTask(version: String, downloadUrl: String): TaskProvider<Test> { fun createCompatibilityTestTask(version: String, downloadUrl: String): Task {
return tasks.register("compatibilityTest$version", Test::class.java) { return tasks.create("compatibilityTest$version", Test::class.java) {
mustRunAfter(tasks.test) mustRunAfter(tasks.test)
maxHeapSize = tasks.test.get().maxHeapSize maxHeapSize = tasks.test.get().maxHeapSize
@@ -1,33 +1,20 @@
/* plugins {
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved. base
* }
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
plugins { base }
val htmlValidator = extensions.create<HtmlValidator>("htmlValidator", project) val htmlValidator = extensions.create<HtmlValidator>("htmlValidator", project)
val buildInfo = project.extensions.getByType<BuildInfo>() val buildInfo = project.extensions.getByType<BuildInfo>()
val validatorConfiguration: Configuration = val validatorConfiguration: Configuration = configurations.create("validator") {
configurations.create("validator") {
resolutionStrategy.eachDependency { resolutionStrategy.eachDependency {
if (requested.group == "log4j" && requested.name == "log4j") { if (requested.group == "log4j" && requested.name == "log4j") {
@Suppress("UnstableApiUsage") useTarget(buildInfo.libs.findLibrary("log4j12Api").get()) @Suppress("UnstableApiUsage")
useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
because("mitigate critical security vulnerabilities") because("mitigate critical security vulnerabilities")
} }
} }
} }
dependencies { dependencies {
@Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage")
@@ -45,17 +32,14 @@ dependencies {
} }
} }
val validateHtml by val validateHtml by tasks.registering(JavaExec::class) {
tasks.registering(JavaExec::class) { val resultFile = file("$buildDir/validateHtml/result.txt")
val resultFile = layout.buildDirectory.file("validateHtml/result.txt")
inputs.files(htmlValidator.sources) inputs.files(htmlValidator.sources)
outputs.file(resultFile) outputs.file(resultFile)
classpath = validatorConfiguration classpath = validatorConfiguration
mainClass.set("nu.validator.client.SimpleCommandLineValidator") mainClass.set("nu.validator.client.SimpleCommandLineValidator")
args( args("--skip-non-html") // --also-check-css doesn't work (still checks css as html), so limit to html files
"--skip-non-html"
) // --also-check-css doesn't work (still checks css as html), so limit to html files
args("--filterpattern", "(.*)Consider adding “lang=(.*)") args("--filterpattern", "(.*)Consider adding “lang=(.*)")
args("--filterpattern", "(.*)Consider adding a “lang” attribute(.*)") args("--filterpattern", "(.*)Consider adding a “lang” attribute(.*)")
args("--filterpattern", "(.*)unrecognized media “amzn-kf8”(.*)") // kindle args("--filterpattern", "(.*)unrecognized media “amzn-kf8”(.*)") // kindle
@@ -64,10 +48,11 @@ val validateHtml by
args(htmlValidator.sources) args(htmlValidator.sources)
// write a basic result file s.t. gradle can consider task up-to-date // write a basic result file s.t. gradle can consider task up-to-date
// writing a result file in case validation fails is not easily possible with JavaExec, but also // writing a result file in case validation fails is not easily possible with JavaExec, but also not strictly necessary
// not strictly necessary
doFirst { project.delete(resultFile) } doFirst { project.delete(resultFile) }
doLast { resultFile.get().asFile.writeText("Success.") } doLast { resultFile.writeText("Success.") }
} }
tasks.check { dependsOn(validateHtml) } tasks.check {
dependsOn(validateHtml)
}
@@ -1,51 +1,17 @@
/* @file:Suppress("HttpUrlsUsage")
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:Suppress("HttpUrlsUsage", "unused")
import org.gradle.accessors.dm.LibrariesForLibs
plugins { plugins {
`java-library` `java-library`
`jvm-toolchains`
id("pklKotlinTest") id("pklKotlinTest")
id("com.diffplug.spotless") id("com.diffplug.spotless")
} }
// make sources Jar available to other subprojects // make sources Jar available to other subprojects
val sourcesJarConfiguration: Provider<Configuration> = configurations.register("sourcesJar") val sourcesJarConfiguration = configurations.register("sourcesJar")
// Version Catalog library symbols.
val libs = the<LibrariesForLibs>()
// Build configuration.
val info = project.extensions.getByType<BuildInfo>()
java { java {
val jvmTarget = JavaVersion.toVersion(info.jvmTarget)
withSourcesJar() // creates `sourcesJar` task withSourcesJar() // creates `sourcesJar` task
withJavadocJar() withJavadocJar()
sourceCompatibility = jvmTarget
targetCompatibility = jvmTarget
toolchain {
languageVersion = info.jdkToolchainVersion
vendor = info.jdkVendor
}
} }
artifacts { artifacts {
@@ -55,26 +21,19 @@ artifacts {
spotless { spotless {
java { java {
googleJavaFormat(libs.versions.googleJavaFormat.get()) googleJavaFormat("1.15.0")
target("src/*/java/**/*.java") targetExclude("**/generated/**", "**/build/**")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
}
kotlin {
ktfmt(libs.versions.ktfmt.get()).googleStyle()
target("src/*/kotlin/**/*.kt")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt")) licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
} }
} }
tasks.compileKotlin { enabled = false } tasks.compileKotlin {
enabled = false
}
tasks.jar { tasks.jar {
manifest { manifest {
attributes += attributes += mapOf("Automatic-Module-Name" to "org.${project.name.replace("-", ".")}")
mapOf(
"Automatic-Module-Name" to "org.${project.name.replace("-", ".")}",
"Add-Exports" to info.jpmsExportsForJarManifest,
)
} }
} }
@@ -85,61 +44,16 @@ tasks.javadoc {
(options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet") (options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet")
} }
val workAroundKotlinGradlePluginBug by val workAroundKotlinGradlePluginBug by tasks.registering {
tasks.registering {
doLast { doLast {
// Works around this problem, which sporadically appears and disappears in different // Works around this problem, which sporadically appears and disappears in different subprojects:
// subprojects: // A problem was found with the configuration of task ':pkl-executor:compileJava' (type 'JavaCompile').
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type
// 'JavaCompile').
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main' // > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
// specified for property 'compileKotlinOutputClasses' does not exist. // specified for property 'compileKotlinOutputClasses' does not exist.
layout.buildDirectory.dir("classes/kotlin/main").get().asFile.mkdirs() file("$buildDir/classes/kotlin/main").mkdirs()
} }
} }
val truffleJavacArgs =
listOf(
// TODO: determine correct limits for Truffle specializations
// (see https://graalvm.slack.com/archives/CNQSB2DHD/p1712380902746829)
"-Atruffle.dsl.SuppressWarnings=truffle-limit"
)
tasks.compileJava { tasks.compileJava {
javaCompiler = info.javaCompiler
dependsOn(workAroundKotlinGradlePluginBug) dependsOn(workAroundKotlinGradlePluginBug)
options.compilerArgs.addAll(truffleJavacArgs + info.jpmsAddModulesFlags)
} }
tasks.withType<JavaCompile>().configureEach {
val jvmTarget = JavaVersion.toVersion(info.jvmTarget)
javaCompiler = info.javaCompiler
sourceCompatibility = jvmTarget.majorVersion
targetCompatibility = jvmTarget.majorVersion
}
tasks.withType<JavaExec>().configureEach { jvmArgs(info.jpmsAddModulesFlags) }
fun Test.configureJdkTestTask(launcher: Provider<JavaLauncher>) {
useJUnitPlatform()
javaLauncher = launcher
systemProperties.putAll(info.testProperties)
jvmArgs.addAll(info.jpmsAddModulesFlags)
}
tasks.test { configureJdkTestTask(info.javaTestLauncher) }
// Prepare test tasks for each JDK version which is within the test target suite for Pkl. Each task
// uses a pinned JDK toolchain version, and is named for the major version which is tested.
//
// Test tasks configured in this manner are executed manually by name, e.g. `./gradlew testJdk11`,
// and automatically as dependencies of `check`.
//
// We omit the current JDK from this list because it is already tested, in effect, by the default
// `test` task.
//
// Pkl subprojects may elect to further configure these tasks as needed; by default, each task
// inherits the configuration of the default `test` task (aside from an overridden launcher).
val jdkTestTasks = info.multiJdkTestingWith(tasks.test) { (_, jdk) -> configureJdkTestTask(jdk) }
if (info.multiJdkTesting) tasks.check { dependsOn(jdkTestTasks) }
@@ -1,33 +1,11 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.accessors.dm.LibrariesForLibs
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
plugins { plugins {
id("pklJavaLibrary") id("pklJavaLibrary")
kotlin("jvm") kotlin("jvm")
} }
// Build configuration.
val buildInfo = project.extensions.getByType<BuildInfo>() val buildInfo = project.extensions.getByType<BuildInfo>()
// Version Catalog library symbols.
val libs = the<LibrariesForLibs>()
dependencies { dependencies {
// At least some of our kotlin APIs contain Kotlin stdlib types // At least some of our kotlin APIs contain Kotlin stdlib types
// that aren't compiled away by kotlinc (e.g., `kotlin.Function`). // that aren't compiled away by kotlinc (e.g., `kotlin.Function`).
@@ -41,6 +19,10 @@ tasks.compileKotlin {
enabled = true // disabled by pklJavaLibrary enabled = true // disabled by pklJavaLibrary
} }
tasks.withType<KotlinJvmCompile>().configureEach { spotless {
compilerOptions { jvmTarget = JvmTarget.fromTarget(buildInfo.jvmTarget.toString()) } kotlin {
ktfmt("0.44").googleStyle()
targetExclude("**/generated/**", "**/build/**")
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
}
} }
@@ -1,23 +1,7 @@
/*
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.URI
import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import java.net.URI
plugins { plugins {
`jvm-test-suite`
kotlin("jvm") kotlin("jvm")
} }
@@ -40,16 +24,17 @@ tasks.withType<Test>().configureEach {
// enable checking of stdlib return types // enable checking of stdlib return types
systemProperty("org.pkl.testMode", "true") systemProperty("org.pkl.testMode", "true")
reports.named("html") { enabled = true } reports.named("html") {
enabled = true
}
testLogging { exceptionFormat = TestExceptionFormat.FULL } testLogging {
exceptionFormat = TestExceptionFormat.FULL
}
addTestListener( addTestListener(object : TestListener {
object : TestListener {
override fun beforeSuite(suite: TestDescriptor) {} override fun beforeSuite(suite: TestDescriptor) {}
override fun beforeTest(testDescriptor: TestDescriptor) {} override fun beforeTest(testDescriptor: TestDescriptor) {}
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {} override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}
// print report link at end of task, not just at end of build // print report link at end of task, not just at end of build
@@ -57,9 +42,7 @@ tasks.withType<Test>().configureEach {
if (descriptor.parent != null) return // only interested in overall result if (descriptor.parent != null) return // only interested in overall result
if (result.resultType == TestResult.ResultType.FAILURE) { if (result.resultType == TestResult.ResultType.FAILURE) {
println( println("\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}")
"\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}"
)
} }
} }
@@ -70,6 +53,5 @@ tasks.withType<Test>().configureEach {
} }
return uri return uri
} }
} })
)
} }
@@ -1,22 +1,7 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
val assembleNative by tasks.registering {} val assembleNative by tasks.registering {}
val testNative by tasks.registering {} val checkNative by tasks.registering {}
val checkNative by tasks.registering { dependsOn(testNative) } val buildNative by tasks.registering {
dependsOn(assembleNative, checkNative)
val buildNative by tasks.registering { dependsOn(assembleNative, checkNative) } }
@@ -1,21 +1,6 @@
/* import org.gradle.api.publish.maven.tasks.GenerateMavenPom
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.Base64 import java.util.Base64
import org.gradle.api.publish.maven.tasks.GenerateMavenPom
plugins { plugins {
`maven-publish` `maven-publish`
@@ -25,7 +10,9 @@ plugins {
publishing { publishing {
publications { publications {
components.findByName("java")?.let { javaComponent -> components.findByName("java")?.let { javaComponent ->
create<MavenPublication>("library") { from(javaComponent) } create<MavenPublication>("library") {
from(javaComponent)
}
} }
withType<MavenPublication>().configureEach { withType<MavenPublication>().configureEach {
pom { pom {
@@ -62,21 +49,16 @@ publishing {
} }
} }
val validatePom by val validatePom by tasks.registering {
tasks.registering {
if (tasks.findByName("generatePomFileForLibraryPublication") == null) {
return@registering
}
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class) val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
val outputFile = val outputFile = file("$buildDir/validatePom") // dummy output to satisfy up-to-date check
layout.buildDirectory.file("validatePom") // dummy output to satisfy up-to-date check
dependsOn(generatePomFileForLibraryPublication) dependsOn(generatePomFileForLibraryPublication)
inputs.file(generatePomFileForLibraryPublication.get().destination) inputs.file(generatePomFileForLibraryPublication.get().destination)
outputs.file(outputFile) outputs.file(outputFile)
doLast { doLast {
outputFile.get().asFile.delete() outputFile.delete()
val pomFile = generatePomFileForLibraryPublication.get().destination val pomFile = generatePomFileForLibraryPublication.get().destination
assert(pomFile.exists()) assert(pomFile.exists())
@@ -91,8 +73,7 @@ val validatePom by
""" """
Found unresolved version selector(s) in generated POM: Found unresolved version selector(s) in generated POM:
${matches.joinToString("\n") { it.groupValues[0] }} ${matches.joinToString("\n") { it.groupValues[0] }}
""" """.trimIndent()
.trimIndent()
) )
} }
} }
@@ -106,34 +87,24 @@ val validatePom by
""" """
Found snapshot version(s) in generated POM of Pkl release version: Found snapshot version(s) in generated POM of Pkl release version:
${matches.joinToString("\n") { it.groupValues[0] }} ${matches.joinToString("\n") { it.groupValues[0] }}
""" """.trimIndent()
.trimIndent()
) )
} }
} }
outputFile.get().asFile.writeText("OK") outputFile.writeText("OK")
}
} }
}
tasks.publish { dependsOn(validatePom) } tasks.publish {
dependsOn(validatePom)
// Workaround for maven publish plugin not setting up dependencies correctly.
// Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734
val dependsOnTasks = mutableListOf<String>()
tasks.withType<AbstractPublishToMaven>().configureEach {
dependsOnTasks.add(name.replace("publish", "sign").replaceAfter("Publication", ""))
dependsOn(dependsOnTasks)
} }
signing { signing {
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword` // provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`
// in CI. // in CI.
val signingKey = val signingKey = (findProperty("signingKey") as String?)
(findProperty("signingKey") as String?)?.let { ?.let { Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII) }
Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)
}
val signingPassword = findProperty("signingPassword") as String? val signingPassword = findProperty("signingPassword") as String?
if (signingKey != null && signingPassword != null) { if (signingKey != null && signingPassword != null) {
useInMemoryPgpKeys(signingKey, signingPassword) useInMemoryPgpKeys(signingKey, signingPassword)
@@ -1,5 +1,5 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Copyright © $YEAR Apple Inc. and the Pkl project authors. All rights reserved. // Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
/* /**
* Copyright © $YEAR Apple Inc. and the Pkl project authors. All rights reserved. * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,6 +1,6 @@
name: main name: main
title: Main Project title: Main Project
version: 0.28.2 version: 0.25.2
prerelease: false prerelease: false
nav: nav:
- nav.adoc - nav.adoc
+12 -26
View File
@@ -1,18 +1,3 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
plugins { plugins {
@@ -25,25 +10,26 @@ sourceSets {
java { java {
srcDir(file("modules/pkl-core/examples")) srcDir(file("modules/pkl-core/examples"))
srcDir(file("modules/pkl-config-java/examples")) srcDir(file("modules/pkl-config-java/examples"))
srcDir(file("modules/java-binding/examples"))
} }
val kotlin = project.extensions.getByType<KotlinJvmProjectExtension>().sourceSets[name].kotlin val kotlin = project.extensions
kotlin.srcDir(file("modules/kotlin-binding/examples")) .getByType<KotlinJvmProjectExtension>()
.sourceSets[name]
.kotlin
kotlin.srcDir(file("modules/pkl-config-kotlin/examples"))
} }
} }
dependencies { dependencies {
testImplementation(projects.pklCore) testImplementation(project(":pkl-core"))
testImplementation(projects.pklConfigJava) testImplementation(project(":pkl-config-java"))
testImplementation(projects.pklConfigKotlin) testImplementation(project(":pkl-config-kotlin"))
testImplementation(projects.pklCommonsTest) testImplementation(project(":pkl-commons-test"))
testImplementation(libs.junitEngine) testImplementation(libs.junitEngine)
testImplementation(libs.antlrRuntime) testImplementation(libs.antlrRuntime)
} }
tasks.test { tasks.test {
inputs inputs.files(fileTree("modules").matching {
.files(fileTree("modules").matching { include("**/pages/*.adoc") }) include("**/pages/*.adoc")
.withPropertyName("asciiDocFiles") })
.withPathSensitivity(PathSensitivity.RELATIVE)
} }
+30 -40
View File
@@ -2,45 +2,35 @@
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
io.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath io.leangen.geantyref:geantyref:1.3.14=testRuntimeClasspath
net.bytebuddy:byte-buddy:1.15.11=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
org.assertj:assertj-core:3.27.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.graalvm.polyglot:polyglot:24.1.2=testRuntimeClasspath org.graalvm.sdk:graal-sdk:22.3.1=testRuntimeClasspath
org.graalvm.sdk:collections:24.1.2=testRuntimeClasspath org.graalvm.truffle:truffle-api:22.3.1=testRuntimeClasspath
org.graalvm.sdk:graal-sdk:24.1.2=testRuntimeClasspath org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.graalvm.sdk:nativeimage:24.1.2=testRuntimeClasspath org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.graalvm.sdk:word:24.1.2=testRuntimeClasspath org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.graalvm.truffle:truffle-api:24.1.2=testRuntimeClasspath org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10=kotlinKlibCommonizerClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-reflect:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-build-common:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-script-runtime:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-build-tools-impl:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-daemon-client:2.0.21=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.0.21=kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-reflect:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-script-runtime:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-common:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-scripting-jvm:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest org.junit.platform:junit-platform-engine:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testRuntimeClasspath
org.junit.jupiter:junit-jupiter-api:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-engine:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.jupiter:junit-jupiter-params:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
org.junit.platform:junit-platform-commons:1.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit.platform:junit-platform-engine:1.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.junit:junit-bom:5.11.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.msgpack:msgpack-core:0.9.8=testRuntimeClasspath
org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
org.organicdesign:Paguro:3.10.3=testRuntimeClasspath org.organicdesign:Paguro:3.10.3=testRuntimeClasspath
org.snakeyaml:snakeyaml-engine:2.9=testRuntimeClasspath org.snakeyaml:snakeyaml-engine:2.5=testRuntimeClasspath
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions empty=annotationProcessor,apiDependenciesMetadata,archives,compile,compileClasspath,compileOnly,compileOnlyDependenciesMetadata,default,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtime,runtimeClasspath,runtimeOnlyDependenciesMetadata,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime
@@ -1,20 +0,0 @@
= Evolution and Roadmap
:uri-pkl-roadmap: https://github.com/orgs/apple/projects/12/views/1
:uri-pkl-evolution: https://github.com/apple/pkl-evolution
== Evolution
Sometimes, a change to Pkl is large enough that it makes sense to create a proposal for the change so that it can be discussed in detail and vetted.
Pkl has a process for managing such designs in a repository called {uri-pkl-evolution}[Pkl Evolution].
== Roadmap
To discover what might be coming in future versions, reference the {uri-pkl-roadmap}[Pkl Roadmap] project on GitHub.
The roadmap describes estimates.
The Pkl team aims to cut a release in February, June, and October of each year.
If an item is not complete by the release cutoff date, the roadmap item may be bumped to the next release.
Additionally, as priorities change, it is possible that items can be moved around or backlogged.
+1 -4
View File
@@ -1,10 +1,7 @@
= User Manual = User Manual
include::../partials/component-attributes.adoc[] include::../partials/component-attributes.adoc[]
Quick Links: Quick Links: xref:pkl-cli:index.adoc#installation[Installation] | xref:language-reference:index.adoc[Language Reference]
xref:pkl-cli:index.adoc#installation[Installation]
| xref:language-reference:index.adoc[Language Reference]
| https://pkl-lang.org/package-docs/pkl/current/index.html[Standard Library]
Pkl -- pronounced _Pickle_ -- is an embeddable configuration language which provides rich support for data templating and validation. Pkl -- pronounced _Pickle_ -- is an embeddable configuration language which provides rich support for data templating and validation.
It can be used from the command line, integrated in a build pipeline, or embedded in a program. It can be used from the command line, integrated in a build pipeline, or embedded in a program.
@@ -4,6 +4,3 @@
* xref:kotlin-binding:index.adoc[Kotlin] * xref:kotlin-binding:index.adoc[Kotlin]
* xref:swift:ROOT:index.adoc[Swift] * xref:swift:ROOT:index.adoc[Swift]
* xref:go:ROOT:index.adoc[Go] * xref:go:ROOT:index.adoc[Go]
* xref:bindings-specification:index.adoc[Specification]
** xref:bindings-specification:message-passing-api.adoc[Message Passing API]
** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]
@@ -3,7 +3,7 @@
// the following attributes must be updated immediately before a release // the following attributes must be updated immediately before a release
// pkl version corresponding to current git commit without -dev suffix or git hash // pkl version corresponding to current git commit without -dev suffix or git hash
:pkl-version-no-suffix: 0.28.2 :pkl-version-no-suffix: 0.25.2
// tells whether pkl version corresponding to current git commit // tells whether pkl version corresponding to current git commit
// is a release version (:is-release-version: '') or dev version (:!is-release-version:) // is a release version (:is-release-version: '') or dev version (:!is-release-version:)
:is-release-version: '' :is-release-version: ''
@@ -66,82 +66,3 @@ endif::[]
:uri-config-java-example: {uri-pkl-examples-tree}/config-java :uri-config-java-example: {uri-pkl-examples-tree}/config-java
:uri-config-kotlin-example: {uri-pkl-examples-tree}/config-kotlin :uri-config-kotlin-example: {uri-pkl-examples-tree}/config-kotlin
:uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc :uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc
:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base
:uri-stdlib-analyzeModule: {uri-pkl-stdlib-docs}/analyze
:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet
:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect
:uri-stdlib-mathModule: {uri-pkl-stdlib-docs}/math
:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml
:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf
:uri-stdlib-evaluatorSettingsModule: {uri-pkl-stdlib-docs}/EvaluatorSettings
:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean
:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()
:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()
:uri-stdlib-Any: {uri-stdlib-baseModule}/Any
:uri-stdlib-String: {uri-stdlib-baseModule}/String
:uri-stdlib-StringToInt: {uri-stdlib-baseModule}/String#toInt()
:uri-stdlib-Int: {uri-stdlib-baseModule}/Int
:uri-stdlib-Float: {uri-stdlib-baseModule}/Float
:uri-stdlib-Number: {uri-stdlib-baseModule}/Number
:uri-stdlib-NaN: {uri-stdlib-baseModule}/#NaN
:uri-stdlib-Infinity: {uri-stdlib-baseModule}/#Infinity
:uri-stdlib-isBetween: {uri-stdlib-baseModule}/Number#isBetween
:uri-stdlib-isFinite: {uri-stdlib-baseModule}/Number#isFinite
:uri-stdlib-Int8: {uri-stdlib-baseModule}/#Int8
:uri-stdlib-Int16: {uri-stdlib-baseModule}/#Int16
:uri-stdlib-Int32: {uri-stdlib-baseModule}/#Int32
:uri-stdlib-UInt8: {uri-stdlib-baseModule}/#UInt8
:uri-stdlib-UInt16: {uri-stdlib-baseModule}/#UInt16
:uri-stdlib-UInt32: {uri-stdlib-baseModule}/#UInt32
:uri-stdlib-UInt: {uri-stdlib-baseModule}/#UInt
:uri-stdlib-Uri: {uri-stdlib-baseModule}/#Uri
:uri-stdlib-matches: {uri-stdlib-baseModule}/String#matches()
:uri-stdlib-Null: {uri-stdlib-baseModule}/Null
:uri-stdlib-ifNonNull: {uri-stdlib-baseModule}/Null#ifNonNull()
:uri-stdlib-List: {uri-stdlib-baseModule}/List
:uri-stdlib-Set: {uri-stdlib-baseModule}/Set
:uri-stdlib-Map: {uri-stdlib-baseModule}/Map
:uri-stdlib-Listing: {uri-stdlib-baseModule}/Listing
:uri-stdlib-Listing-default: {uri-stdlib-baseModule}/Listing#default
:uri-stdlib-Listing-isDistinct: {uri-stdlib-baseModule}/Listing#isDistinct
:uri-stdlib-Listing-isDistinctBy: {uri-stdlib-baseModule}/Listing#isDistinctBy()
:uri-stdlib-Mapping: {uri-stdlib-baseModule}/Mapping
:uri-stdlib-Mapping-default: {uri-stdlib-baseModule}/Mapping#default
:uri-stdlib-Duration: {uri-stdlib-baseModule}/Duration
:uri-stdlib-Duration-value: {uri-stdlib-baseModule}/Duration#value
:uri-stdlib-Duration-unit: {uri-stdlib-baseModule}/Duration#unit
:uri-stdlib-DurationUnit: {uri-stdlib-baseModule}/#DurationUnit
:uri-stdlib-DataSize: {uri-stdlib-baseModule}/DataSize
:uri-stdlib-DataSize-value: {uri-stdlib-baseModule}/DataSize#value
:uri-stdlib-DataSize-unit: {uri-stdlib-baseModule}/DataSize#unit
:uri-stdlib-DataSizeUnit: {uri-stdlib-baseModule}/#DataSizeUnit
:uri-stdlib-Dynamic: {uri-stdlib-baseModule}/Dynamic
:uri-stdlib-Dynamic-toTyped: {uri-stdlib-baseModule}/Dynamic#toTyped()
:uri-stdlib-Typed: {uri-stdlib-baseModule}/Typed
:uri-stdlib-Regex: {uri-stdlib-baseModule}/Regex
:uri-stdlib-Regex-method: {uri-stdlib-baseModule}/#Regex()
:uri-stdlib-Regex-match: {uri-stdlib-baseModule}/Regex#match
:uri-stdlib-RegexMatch: {uri-stdlib-baseModule}/RegexMatch
:uri-stdlib-Pair: {uri-stdlib-baseModule}/Pair
:uri-stdlib-IntSeq: {uri-stdlib-baseModule}/IntSeq
:uri-stdlib-Class: {uri-stdlib-baseModule}/Class
:uri-stdlib-TypeAlias: {uri-stdlib-baseModule}/TypeAlias
:uri-stdlib-Deprecated: {uri-stdlib-baseModule}/Deprecated
:uri-stdlib-ValueRenderer: {uri-stdlib-baseModule}/ValueRenderer
:uri-stdlib-PcfRenderer-converters: {uri-stdlib-baseModule}/PcfRenderer#converters
:uri-stdlib-Function: {uri-stdlib-baseModule}/Function
:uri-stdlib-Function0: {uri-stdlib-baseModule}/Function0
:uri-stdlib-Function1: {uri-stdlib-baseModule}/Function1
:uri-stdlib-Function1-apply: {uri-stdlib-baseModule}/Function1#apply()
:uri-stdlib-Function2: {uri-stdlib-baseModule}/Function2
:uri-stdlib-Function3: {uri-stdlib-baseModule}/Function3
:uri-stdlib-Function4: {uri-stdlib-baseModule}/Function4
:uri-stdlib-Function5: {uri-stdlib-baseModule}/Function5
:uri-stdlib-Resource: {uri-stdlib-baseModule}/Resource
:uri-stdlib-outputFiles: {uri-stdlib-baseModule}/ModuleOutput#files
:uri-messagepack: https://msgpack.org/index.html
:uri-messagepack-spec: https://github.com/msgpack/msgpack/blob/master/spec.md
:uri-pkl-roadmap: https://github.com/orgs/apple/projects/12/views/1
@@ -1,197 +0,0 @@
= Pkl Binary Encoding
include::ROOT:partial$component-attributes.adoc[]
include::partial$component-attributes.adoc[]
Pkl values can be encoded into a binary format.
This format is used for Pkl's non-JVM language bindings, for example, for its Go and Swift bindings.
The binary format is uses link:{uri-messagepack}[MessagePack] encoding.
== Primitives
All Pkl primitives turn into their respective MessagePack primitive.
|===
|Pkl Type|MessagePack format
|link:{uri-stdlib-Int}[Int]
|link:{uri-messagepack-int}[int]
|link:{uri-stdlib-Float}[Float]
|link:{uri-messagepack-float}[float]
|link:{uri-stdlib-String}[String]
|link:{uri-messagepack-str}[string]
|link:{uri-stdlib-Boolean}[Boolean]
|link:{uri-messagepack-bool}[bool]
|link:{uri-stdlib-Null}[Null]
|link:{uri-messagepack-nil}[nil]
|===
NOTE: Pkl integers are encoded into the smallest int type that the number will fit into.
For example, value `8` gets encoded as MessagePack `int8` format.
== Non-primitives
All non-primitive values are encoded as MessagePack arrays.
The first slot of the array designates the value's type. The remaining slots have fixed meanings depending on the type.
The array's length is the number of slots that are filled. For example, xref:{uri-stdlib-List}[List] is encoded as an MessagePack array with two elements.
|===
|Pkl type |Slot 1 2+|Slot 2 2+|Slot 3 2+|Slot 4
||code |type |description |type |description |type |description
|link:{uri-stdlib-Typed}[Typed], link:{uri-stdlib-Dynamic}[Dynamic]
|`0x1`
|link:{uri-messagepack-str}[str]
|Fully qualified class name
|link:{uri-messagepack-str}[str]
|Enclosing module URI
|link:{uri-messagepack-array}[array]
|Array of <<object-members,object members>>
|link:{uri-stdlib-Map}[Map]
|`0x2`
|link:{uri-messagepack-map}[map]
|Map of `<value>` to `<value>`
|
|
|
|
|link:{uri-stdlib-Mapping}[Mapping]
|`0x3`
|link:{uri-messagepack-map}[map]
|Map of `<value>` to `<value>`
|
|
|
|
|link:{uri-stdlib-List}[List]
|`0x4`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Listing}[Listing]
|`0x5`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Set}[Set]
|`0x6`
|link:{uri-messagepack-array}[array]
|Array of `<value>`
|
|
|
|
|link:{uri-stdlib-Duration}[Duration]
|`0x7`
|{uri-messagepack-float}[float64]
|Duration value
|link:{uri-messagepack-str}[str]
|link:{uri-stdlib-DurationUnit}[Duration unit] (`"ns"`, `"ms"`, etc.)
|
|
|link:{uri-stdlib-DataSize}[DataSize]
|`0x8`
|link:{uri-messagepack-float}[float64]
|Value (float64)
|link:{uri-messagepack-str}[str]
|link:{uri-stdlib-DataSizeUnit}[DataSize unit] (`"b"`, `"kb"`, etc.)
|
|
|link:{uri-stdlib-Pair}[Pair]
|`0x9`
|`<value>`
|First value
|`<value>`
|Second value
|
|
|link:{uri-stdlib-IntSeq}[IntSeq]
|`0xA`
|link:{uri-messagepack-int}[int]
|Start
|link:{uri-messagepack-int}[int]
|End
|link:{uri-messagepack-int}[int]
|Step
|link:{uri-stdlib-Regex}[Regex]
|`0xB`
|link:{uri-messagepack-str}[str]
|Regex string representation
|
|
|
|
|link:{uri-stdlib-Class}[Class]
|`0xC`
|
|
|
|
|
|
|link:{uri-stdlib-TypeAlias}[TypeAlias]
|`0xD`
|
|
|
|
|
|
|===
[[object-members]]
== Object Members
Like non-primitive values, object members are encoded as MessagePack arrays, where the first slot designates the value's type.
|===
|Member type |Slot 1 2+|Slot 2 2+|Slot 3
| |code |type |description |type |description
|Property
|`0x10`
|link:{uri-messagepack-str}[str]
|key
|`<value>`
|property value
|Entry
|`0x11`
|`<value>`
|entry key
|`<value>`
|entry value
|Element
|`0x12`
|link:{uri-messagepack-int}[int]
|index
|`<value>`
|element value
|===
@@ -1,173 +0,0 @@
= Language Binding Specification
:uri-pkl-go-github: https://github.com/apple/pkl-go
:uri-pkl-swift-github: https://github.com/apple/pkl-swift
Pkl can be embedded within any host application.
The host application has access to low level controls.
It is able to manage the lifecycle of evaluators, as well as provide custom modules and resources to Pkl.
Currently, Pkl must be embedded as a child process, by shelling out to the CLI using the xref:pkl-cli:index.adoc#command-server[`pkl server`] command. In the future, a C library will also be provided.
When embedded, communication between a host application and Pkl happens via message passing.
The message passing specification can be found in xref:message-passing-api.adoc[].
For examples of language bindings in practice, review the link:{uri-pkl-go-github}[pkl-go], or the link:{uri-pkl-swift-github}[pkl-swift] codebases.
NOTE: Pkl's Java and Kotlin libraries binds to Pkl directly, and do not use message passing.
== Features of a language binding
A language binding for Pkl should generally have the following components:
. A client that spawns `pkl server`, and talks to it using message passing.
. A deserializer that turns xref:binary-encoding.adoc[pkl binary encoding] into a structure in the host language.
. A code generator that transforms Pkl schemas into schemas written in the host language.
The code generator is mostly written in Pkl, with a lightweight executable that acts as the glue layer.
For examples of code generators, consult link:{uri-pkl-go-github}/tree/main/codegen[pkl-go] and link:{uri-pkl-swift-github}/tree/main/codegen[pkl-swift].
== Sample flow
Here is a sample flow for evaluating a module with the following contents:
.\file:///path/to/myModule.pkl
[source,{pkl}]
----
module MyModule
theModules = import*("customfs:/*.pkl")
----
. Client sends xref:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request], including `customfs` as a custom module reader.
+
[source,json]
----
[
0x20,
{
"requestId": 135,
"allowedModules": ["pkl:", "repl:", "file:", "customfs:"],
"clientModuleReaders": [
{
"scheme": "customfs",
"hasHierarchicalUris": true,
"isGlobbable": true,
"isLocal": true
}
]
}
]
----
. Server sends xref:message-passing-api.adoc#create-evaluator-response[Create Evaluator Response], with an evaluator id.
+
[source,json]
----
[
0x21,
{
"requestId": 135,
"evaluatorId": -135901
}
]
----
. Client sends xref:message-passing-api.adoc#evaluate-request[Evaluate Request], providing the module's URI.
+
[source,json]
----
[
0x23,
{
"requestId": 9805131,
"evaluatorId": -13901,
"moduleUri": "file:///path/to/myModule.pkl"
}
]
----
. During evaluation, server evaluates `import*("customfs:/*.pkl")`, and sends xref:message-passing-api.adoc#list-modules-request[List Modules Request].
+
[source,json]
----
[
0x2c,
{
"requestId": -6478924,
"evaluatorId": -13901,
"uri": "customfs:/"
}
]
----
. Client responds with xref:message-passing-api.adoc#list-modules-response[List Modules Response].
In our pretend scenario, there is only one file; `foo.pkl`.
+
[source,json]
----
[
0x2d,
{
"requestId": -6478924,
"evaluatorId": -13901,
"pathElements": [
{
"name": "foo.pkl",
"isDirectory": false
}
]
}
]
----
. Server sends xref:message-passing-api.adoc#read-module-request[Read Module Request] to read `foo.pkl`.
+
[source,json]
----
[
0x28,
{
"requestId": 36408291,
"evaluatorId": -13901,
"uri": "customfs:/foo.pkl"
}
]
----
. Client responds with the module's contents
+
[source,json]
----
[
0x29,
{
"requestId": 36408291,
"evaluatorId": -13901,
"contents": "foo = 1"
}
]
----
. Server finishes evaluation, and responds with the xref:message-passing-api.adoc#evaluate-response[Evaluate Response].
+
[source,json]
----
[
0x24,
{
"requestId": 9805131,
"evaluatorId": -13901,
"result": <pkl binary value>
}
]
----
. Client sends xref:message-passing-api.adoc#close-evaluator[Close Evaluator].
+
[source,json]
----
[
0x22,
{
"evaluatorId": -13901
}
]
----
== Debug logs
Set the env var `PKL_DEBUG=1` to enable more verbose logging from Pkl.
It is recommended that clients also use this environment variable to enable debug logs of their own.
@@ -1,692 +0,0 @@
= Message Passing API
include::ROOT:partial$component-attributes.adoc[]
include::partial$component-attributes.adoc[]
All messages are encoded in link:{uri-messagepack}[MessagePack], as an array with two elements.
The first element of the array is a code that designates the message's type, encoded as an int.
The second element of the array is the message body, encoded as a map.
Messages are passed between the _client_ and the _server_.
When hosting Pkl (for example, the Swift application when using pkl-swift), the _client_ is the host program and the _server_ is the entity that provides controls for interacting with Pkl.
When implementing an xref:language-reference:index.adoc#external-readers[external reader], the _client_ is the external reader process and the _server_ is the Pkl evaluator.
For example, in JSON representation:
[source,json]
----
[
1, // <1>
{ "someKey": "someValue" } // <2>
]
----
<1> Code indicating message type
<2> Message body
== Message types
[[client-message]]
=== Client Message
A message passed from the client to the server.
[[server-message]]
=== Server Message
A message passed from the server to the client.
[[request-message]]
=== Request Message
A message sent with a `requestId` value.
The `requestId` should be a unique number at the time of message send.
The other side is expected to respond with a <<response-message>> with the same `requestId`.
[[response-message]]
=== Response Message
A message that is the response to a <<request-message>>.
It contains the same `requestId` of the request message.
[[one-way-message]]
=== One Way Message
A fire-and-forget message where no response is expected.
== Messages
All messages have their schema described in Pkl.
A nullable type means that the property should be omitted (as opposed to the property's value being `nil`).
[[create-evaluator-request]]
=== Create Evaluator Request
Code: `0x20` +
Type: <<client-message,Client>> <<request-message,Request>>
Create an evaluator with the provided evaluator settings.
Upon creating the evaluator, the server sends back a <<create-evaluator-response>> message.
Schema:
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// Regex patterns to determine which modules are allowed for import.
///
/// API version of the CLI's `--allowed-modules` flag
allowedModules: Listing<String>?
/// Regex patterns to determine which resources are allowed to be read.
///
/// API version of the CLI's `--allowed-resources` flag
allowedResources: Listing<String>?
/// Register client-side module readers.
clientModuleReaders: Listing<ClientModuleReader>?
/// Register client-side resource readers.
clientResourceReaders: Listing<ClientResourceReader>?
/// Directories, ZIP archives, or JAR archives
/// to search when resolving `modulepath:` URIs.
///
/// API version of the CLI's `--module-path` flag.
modulePaths: Listing<String>?
/// Environment variable to set.
///
/// API version of the CLI's `--env-var` flag.
env: Mapping<String, String>?
/// External properties to set.
///
/// API version of the CLI's `--properties` flag.
properties: Mapping<String, String>?
/// Duration, in seconds, after which evaluation of a source module will be timed out.
///
/// API version of the CLI's `--timeout` flag.
timeoutSeconds: Int?
/// Restricts access to file-based modules and resources to those located under the root directory.
rootDir: String?
/// The cache directory for storing packages.
cacheDir: String?
/// The format to generate.
///
/// This sets the `pkl.outputFormat` external property.
outputFormat: String?
/// The project dependency settings.
project: Project?
/// Configuration of outgoing HTTP(s) requests.
///
/// Added in Pkl 0.26.0.
http: Http?
class ClientResourceReader {
/// The URI scheme this reader is responsible for reading.
scheme: String
/// Tells whether the path part of this URI has a
/// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).
///
/// An example of a hierarchical URI is `file:///path/to/my/file`, where
/// `/path/to/my/file` designates a nested path through the `/` character.
///
/// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote
/// any form of hierarchy.
hasHierarchicalUris: Boolean
/// Tells whether this reader supports globbing.
isGlobbable: Boolean
}
class ClientModuleReader {
/// The URI scheme this reader is responsible for reading.
scheme: String
/// Tells whether the path part of this URI has a
/// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).
///
/// An example of a hierarchical URI is `file:///path/to/my/file`, where
/// `/path/to/my/file` designates a nested path through the `/` character.
///
/// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote
/// any form of hierarchy.
hasHierarchicalUris: Boolean
/// Tells whether this reader supports globbing.
isGlobbable: Boolean
/// Tells whether the module is local to the system.
///
/// A local resource that [hasHierarchicalUris] supports triple-dot imports.
isLocal: Boolean
}
class Project {
type: "local"
/// The canonical URI of this project's package
packageUri: String?
/// The URI pointing to the location of the project file.
projectFileUri: String
/// The dependencies of this project.
dependencies: Mapping<String, Project|RemoteDependency>
}
class RemoteDependency {
type: "remote"
/// The canonical URI of this dependency
packageUri: String?
/// The checksums of this remote dependency
checksums: Checksums?
}
class Checksums {
/// The sha-256 checksum of this dependency's metadata.
sha256: String
}
class Http {
/// PEM format certificates to trust when making HTTP requests.
///
/// If [null], Pkl will trust its own built-in certificates.
caCertificates: Binary?
/// Configuration of the HTTP proxy to use.
///
/// If [null], uses the operating system's proxy configuration.
proxy: Proxy?
}
/// Settings that control how Pkl talks to HTTP proxies.
class Proxy {
/// The proxy to use for HTTP(S) connections.
///
/// At the moment, only HTTP proxies are supported.
///
/// Example:
/// ```
/// address = "http://my.proxy.example.com:5080"
/// ```
address: Uri(startsWith("http://"))?
/// Hosts to which all connections should bypass a proxy.
///
/// Values can be either hostnames, or IP addresses.
/// IP addresses can optionally be provided using [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation).
///
/// The only wildcard is `"*"`, which disables all proxying.
///
/// A hostname matches all subdomains.
/// For example, `example.com` matches `foo.example.com`, but not `fooexample.com`.
/// A hostname that is prefixed with a dot matches the hostname itself,
/// so `.example.com` matches `example.com`.
///
/// Optionally, a port can be specified.
/// If a port is omitted, all ports are matched.
///
/// Example:
///
/// ```
/// noProxy {
/// "127.0.0.1"
/// "169.254.0.0/16"
/// "example.com"
/// "localhost:5050"
/// }
/// ```
noProxy: Listing<String>(isDistinct)
}
typealias Binary = Any // <1>
----
<1> link:{uri-messagepack-bin}[bin format] (not expressable in Pkl)
Example:
[source,json5]
----
[
0x20,
{
"requestId": 193501,
"allowedModules": ["pkl:", "repl:"],
"allowedResources": ["file:", "package:", "projectpackage:"]
}
]
----
[[create-evaluator-response]]
=== Create Evaluator Response
Code: `0x21` +
Type: <<server-message,Server>> <<response-message,Response>>
The response for a <<create-evaluator-request>>.
If the evaluator was created successfully, `evaluatorId` is set. Otherwise, `error` is set to the resulting error.
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// A number identifying the created evaluator.
evaluatorId: Int?
/// A message detailing why the evaluator was not created.
error: String?
----
[[close-evaluator]]
=== Close Evaluator
Code: `0x22` +
Type: <<client-message,Client>> <<one-way-message,One Way>>
Tells the Pkl server to close an evaluator, releasing any resources it may be holding.
[source,pkl]
----
/// A number identifying this evaluator.
evaluatorId: Int
----
[[evaluate-request]]
=== Evaluate Request
Code: `0x23` +
Type: <<client-message,Client>> <<request-message,Request>>
Evaluate a module.
[source,pkl]
----
/// A number identifying this request
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The absolute URI of the module to be evaluated.
moduleUri: String
/// The module's contents.
///
/// If [null], Pkl will load the module at runtime.
moduleText: String?
/// The Pkl expression to be evaluated within the module.
///
/// If [null], evaluates the whole module.
expr: String?
----
[[evaluate-response]]
=== Evaluate Response
Code: `0x24` +
Type: <<server-message,Server>> <<response-message,Response>>
The server's response to <<evaluate-request>>.
If the evaluation is successful, the response is the Pkl value encoded in xref:binary-encoding.adoc[binary encoding].
[source,pkl]
----
/// The requestId of the Evaluate request
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The evaluation contents, if successful.
result: Binary? // <1>
/// A message detailing why evaluation failed.
error: String?
typealias Binary = Any // <1>
----
<1> xref:binary-encoding.adoc[Pkl Binary Encoding] in link:{uri-messagepack-bin}[bin format] (not expressable in Pkl)
[[log]]
=== Log
Code: `0x25` +
Type: <<server-message,Server>> <<one-way-message,One Way>>
Tells the client to emit a log message, during the execution of a Pkl program.
A log can occur through a xref:language-reference:index.adoc#debugging[trace()] expression, or through a warning (for example, when encountering a link:{uri-stdlib-Deprecated}[Deprecated] value.)
[source,pkl]
----
/// A number identifying this evaluator.
evaluatorId: Int
/// A number identifying the log level.
///
/// - 0: trace
/// - 1: warn
level: Int(this == 0 || this == 1)
/// The message to be logged
message: String
/// A string representing the source location within Pkl code producing this log output.
frameUri: String
----
[[read-resource-request]]
=== Read Resource Request
Code: `0x26` +
Type: <<server-message,Server>> <<request-message,Request>>
Read a resource at the given URI.
This message occurs when a read expression (`read`/`read?`/`read*`) is encountered within a program, and its scheme matches a client resource reader.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The URI of the resource.
uri: String
----
[[read-resource-response]]
=== Read Resource Response
Code: `0x27` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<read-resource-request>>.
If successful, `contents` is set.
Otherwise, `error` is set.
If neither is set, `contents` defaults to an empty byte array.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The contents of the resource.
contents: Binary? // <1>
/// The description of the error that occurred when reading this resource.
error: String?
typealias Binary = Any // <1>
----
<1> MessagePack's link:https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family[bin format family] (not expressable in Pkl)
[[read-module-request]]
=== Read Module Request
Code: `0x28` +
Type: <<server-message,Server>> <<request-message,Request>>
Read a module at the given URI.
This message occurs during the evaluation of an import statement or expression (`import`/`import*`), when a scheme matches a client module reader.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The URI of the module.
uri: String
----
[[read-module-response]]
=== Read Module Response
Code: `0x29` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<read-module-request>>.
If successful, `contents` is set.
Otherwise, `error` is set.
If neither is set, `contents` defaults to an empty string.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The string contents of the module.
contents: String?
/// The description of the error that occurred when reading this resource.
error: String?
----
[[list-resources-request]]
=== List Resources Request
Code: `0x2a` +
Type: <<server-message,Server>> <<request-message,Request>>
List resources at the specified base path.
This message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-reads[globbed read], when a scheme matches a client resource reader's scheme.
If the resource reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all resource elements for that scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The base URI to list resources.
uri: String
----
[[list-resources-response]]
=== List Resources Response
Code: `0x2b` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<list-resources-request>>.
If successful, `pathElements` is set.
Otherwise, `error` is set.
If neither are set, `pathElements` default to an empty list.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The elements at the provided base path.
pathElements: Listing<PathElement>?
/// The description of the error that occurred when listing elements.
error: String?
class PathElement {
/// The name of the element at this path
name: String
/// Tells whether the element is a directory.
isDirectory: Boolean
}
----
[[list-modules-request]]
=== List Modules Request
Code: `0x2c` +
Type: <<server-message,Server>> <<request-message,Request>>
List modules at the specified base path.
This message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-imports[globbed import], when a scheme matches a client resource reader's scheme.
If the module reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all module elements for that scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The base URI to list modules.
uri: String
----
[[list-modules-response]]
=== List Modules Response
Code: `0x2d` +
Type: <<client-message,Client>> <<response-message,Response>>
The response to <<list-modules-request>>.
If successful, `pathElements` is set.
Otherwise, `error` is set.
If neither are set, `pathElements` default to an empty list.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// A number identifying this evaluator.
evaluatorId: Int
/// The elements at the provided base path.
pathElements: Listing<PathElement>?
/// The description of the error that occurred when listing elements.
error: String?
class PathElement {
/// The name of the element at this path
name: String
/// Tells whether the element is a directory.
isDirectory: Boolean
}
----
[[initialize-module-reader-request]]
=== Initialize Module Reader Request
Code: `0x2e` +
Type: <<server-message,Server>> <<request-message,Request>>
Initialize an xref:language-reference:index.adoc#external-readers[External Module Reader].
This message is sent to external reader processes the first time a module scheme it is registered for is read.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// The module scheme to initialize.
scheme: String
----
[[initialize-module-reader-response]]
=== Initialize Module Reader Response
Code: `0x2f` +
Type: <<client-message,Client>> <<response-message,Response>>
Return the requested external module reader specification.
The `spec` field should be set to `null` when the external process does not implement the requested module scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// Client-side module reader spec.
///
/// Null when the external process does not implement the requested module scheme.
spec: ClientModuleReader?
----
`ClientModuleReader` is defined above by <<create-evaluator-request,Create Evaluator Request>>.
[[initialize-resource-reader-request]]
=== Initialize Resource Reader Request
Code: `0x30` +
Type: <<server-message,Server>> <<request-message,Request>>
Initialize an xref:language-reference:index.adoc#external-readers[External Resource Reader].
This message is sent to external reader processes the first time a resource scheme it is registered for is read.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// The resource scheme to initialize.
scheme: String
----
[[initialize-resource-reader-response]]
=== Initialize Resource Reader Response
Code: `0x31` +
Type: <<client-message,Client>> <<response-message,Response>>
Return the requested external resource reader specification.
The `spec` field should be set to `null` when the external process does not implement the requested resource scheme.
[source,pkl]
----
/// A number identifying this request.
requestId: Int
/// Client-side resource reader spec.
///
/// Null when the external process does not implement the requested resource scheme.
spec: ClientResourceReader?
----
`ClientResourceReader` is defined above by <<create-evaluator-request,Create Evaluator Request>>.
[[close-external-process]]
=== Close External Process
Code: `0x32` +
Type: <<server-message,Server>> <<one-way-message,One Way>>
Initiate graceful shutdown of the external reader process.
[source,pkl]
----
/// This message has no properties.
----
@@ -1,9 +0,0 @@
:uri-github-binary-encoding-snippet-tests: {uri-github-tree}/pkl-server/src/test/files/SnippetTests
:uri-messagepack-bool: {uri-messagepack-spec}#bool-format-family
:uri-messagepack-int: {uri-messagepack-spec}#int-format-family
:uri-messagepack-float: {uri-messagepack-spec}#float-format-family
:uri-messagepack-str: {uri-messagepack-spec}#str-format-family
:uri-messagepack-bin: {uri-messagepack-spec}#bin-format-family
:uri-messagepack-array: {uri-messagepack-spec}#array-format-family
:uri-messagepack-map: {uri-messagepack-spec}#map-format-family
:uri-messagepack-nil: {uri-messagepack-spec}#nil-format
@@ -13,14 +13,14 @@ Also, Pkl's strong and weak points in comparison to other configuration language
[[static-config-formats]] [[static-config-formats]]
== Pkl vs. Static Config Formats == Pkl vs. Static Config Formats
Static configuration formats such as JSON, YAML, TOML, and XML work reasonably well for simple configuration needs. Static configuration formats such as JSON, YAML, and XML work reasonably well for simple configuration needs.
However, they do have some shortcomings, including: However, they do have some shortcomings, including:
. They are not very human-friendly to read and write. (JSON, XML) . They are not very human-friendly to read and write. (JSON, XML)
. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML, TOML) . They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML)
. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, TOML, XML) . They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, XML)
. They do not offer standardized or widely available schema validators. (JSON, YAML, TOML) . They do not offer standardized or widely available schema validators. (JSON, YAML)
. They offer little or no schema-aware tooling. (JSON, YAML, TOML) . They offer little or no schema-aware tooling. (JSON, YAML)
Pkl addresses these shortcomings as follows: Pkl addresses these shortcomings as follows:
@@ -22,7 +22,7 @@ At the same time, anyone configuring your application -- whether that's your use
+ +
At the time of writing, Pkl offers configuration libraries for the JVM runtime, Swift, and also for Golang. At the time of writing, Pkl offers configuration libraries for the JVM runtime, Swift, and also for Golang.
+ +
We maintain the following libraries: We maintian the following libraries:
+ +
* xref:java-binding:pkl-config-java.adoc[pkl-config-java] for Java compatible languages * xref:java-binding:pkl-config-java.adoc[pkl-config-java] for Java compatible languages
* xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin] for the {uri-kotlin-homepage}[Kotlin] language. * xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin] for the {uri-kotlin-homepage}[Kotlin] language.
@@ -1,7 +1,6 @@
import org.pkl.config.java.Config; import org.pkl.config.java.Config;
import org.pkl.config.java.ConfigEvaluator; import org.pkl.config.java.ConfigEvaluator;
import org.pkl.config.java.JavaType; import org.pkl.config.java.JavaType;
import org.pkl.core.ModuleSource;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@@ -12,8 +11,8 @@ public class JavaConfigExample {
// tag::usage[] // tag::usage[]
Config config; Config config;
try (var evaluator = ConfigEvaluator.preconfigured()) { // <1> try (var evaluator = ConfigEvaluator.preconfigured()) { // <1>
config = evaluator.evaluate( config = evaluator.evaluateText(
ModuleSource.text("pigeon { age = 5; diet = new Listing { \"Seeds\" } }")); // <2> "pigeon { age = 5; diet = \"Seeds\" }"); // <2>
} }
var pigeon = config.get("pigeon"); // <3> var pigeon = config.get("pigeon"); // <3>
var age = pigeon.get("age").as(int.class); // <4> var age = pigeon.get("age").as(int.class); // <4>
+36 -39
View File
@@ -1,6 +1,6 @@
= Java Code Generator = Java Code Generator
include::ROOT:partial$component-attributes.adoc[] include::ROOT:partial$component-attributes.adoc[]
:uri-pkl-codegen-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-codegen-java :uri-pkl-codgen-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-codegen-java
The Java source code generator takes Pkl class definitions as an input, and generates corresponding Java classes with equally named properties. The Java source code generator takes Pkl class definitions as an input, and generates corresponding Java classes with equally named properties.
@@ -23,8 +23,8 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
[[install-library]] [[install-library]]
=== Java Library === Java Library
The `pkl-codegen-java` library is available {uri-pkl-codegen-java-maven-module}[from Maven Central]. The `pkl-codegen-java` library is available {uri-pkl-codgen-java-maven-module}[from Maven Central].
It requires Java 17 or higher. It requires Java 11 or higher.
ifndef::is-release-version[] ifndef::is-release-version[]
NOTE: Snapshots are published to repository `{uri-sonatype}`. NOTE: Snapshots are published to repository `{uri-sonatype}`.
@@ -36,42 +36,36 @@ To use the library in a Gradle project, declare the following dependency:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
implementation("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
[source,groovy,subs="+attributes"] [source,groovy,subs="+attributes"]
---- ----
dependencies { dependencies {
implementation "org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}" compile "org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}"
} }
ifndef::is-release-build[]
repositories { repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
endif::[]
} }
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
endif::[]
---- ----
==== ====
@@ -88,7 +82,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-codegen-java</artifactId> <artifactId>pkl-codegen-java</artifactId>
<version>{pkl-artifact-version}</version> <version>{pkl-artifact-version}</version>
</dependency> </dependency>
ifndef::is-release-version[] ifndef::is-release-build[]
<repositories> <repositories>
<repository> <repository>
<id>sonatype-s01</id> <id>sonatype-s01</id>
@@ -145,27 +139,30 @@ Flag that indicates to generate private final fields and public getter methods i
[%collapsible] [%collapsible]
==== ====
Default: (flag not set) + Default: (flag not set) +
Flag that indicates to preserve Pkl doc comments by generating corresponding Javadoc comments. Flag that indicates to generate Javadoc based on doc comments for Pkl modules, classes, and properties.
==== ====
.--params-annotation .--params-annotation
[%collapsible] [%collapsible]
==== ====
Default: `none` if `--generate-spring-boot` is set, `org.pkl.config.java.mapper.Named` otherwise + Default: `org.pkl.config.java.mapper.Named` +
Fully qualified name of the annotation type to use for annotating constructor parameters with their name. + Fully qualified name of the annotation to use on constructor parameters.
The specified annotation type must have a `value` parameter of type `String` or the generated code may not compile.
If set to `none`, constructor parameters are not annotated.
Whether and how constructor parameters should be annotated depends on the library that instantiates the generated classes.
For Spring Boot applications, and for users of `pkl-config-java` compiling the generated classes with `-parameters`, no annotation is required.
==== ====
.--non-null-annotation .--non-null-annotation
[%collapsible] [%collapsible]
==== ====
Default: `org.pkl.config.java.mapper.NonNull` + Default: `org.pkl.config.java.mapper.NonNull` +
Fully qualified name of the annotation type to use for annotating non-null types. + Fully qualified named of the annotation class to use for non-null types. +
The specified annotation type must be annotated with `@java.lang.annotation.Target(ElementType.TYPE_USE)` This annotation is required to have `java.lang.annotation.ElementType.TYPE_USE` as a `@Target`
or the generated code may not compile. or it may generate code that does not compile.
====
.--implement-serializable
[%collapsible]
====
Default: (flag not set) +
Whether to make generated classes implement `java.io.Serializable`.
==== ====
Common code generator options: Common code generator options:
@@ -23,7 +23,7 @@ It offers a higher-level API specifically designed for consuming application run
== Installation == Installation
The _pkl-config-java_ library is available {uri-pkl-config-java-maven-module}[from Maven Central]. The _pkl-config-java_ library is available {uri-pkl-config-java-maven-module}[from Maven Central].
It requires Java 17 or higher. It requires Java 11 or higher.
=== Gradle === Gradle
@@ -31,45 +31,37 @@ To use the library in a Gradle project, declare the following dependency:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
implementation("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
[source,groovy,subs="+attributes"] [source,groovy,subs="+attributes"]
---- ----
dependencies { dependencies {
implementation "org.pkl-lang:pkl-config-java:{pkl-artifact-version}" compile "org.pkl-lang:pkl-config-java:{pkl-artifact-version}"
} }
ifdef::is-release-version[] ifndef::is-release-build[]
repositories {
mavenCentral()
}
endif::[]
ifndef::is-release-version[]
repositories { repositories {
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
} }
endif::[] endif::[]
---- ----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
endif::[]
----
==== ====
Unlike `pkl-config-java`, `pkl-config-java__-all__` is a fat Jar with renamed third-party packages to avoid version conflicts. Unlike `pkl-config-java`, `pkl-config-java__-all__` is a fat Jar with renamed third-party packages to avoid version conflicts.
@@ -87,7 +79,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-config-java</artifactId> <artifactId>pkl-config-java</artifactId>
<version>{pkl-artifact-version}</version> <version>{pkl-artifact-version}</version>
</dependency> </dependency>
ifndef::is-release-version[] ifndef::is-release-build[]
<repositories> <repositories>
<repository> <repository>
<id>sonatype-s01</id> <id>sonatype-s01</id>
@@ -21,57 +21,3 @@ Relative paths are resolved against the working directory.
Default: (not set) + Default: (not set) +
Flag that indicates to generate config classes for use with Spring Boot. Flag that indicates to generate config classes for use with Spring Boot.
==== ====
.--implement-serializable
[%collapsible]
====
Default: (not set) +
Flag that indicates to generate classes that implement `java.io.Serializable`.
====
.--rename
[%collapsible]
====
Default: (none) +
Example: `foo.=com.example.foo.` +
Allows to change default class and package names (derived from Pkl module names) in the generated code.
When you need the generated class or package names to be different from the default names derived from the Pkl module names, you can define a rename mapping, where the key is the original Pkl module name prefix, and the value is its replacement.
When you do, the generated code's `package` declarations, class names, as well as file locations, will be modified according to this mapping.
The prefixes are replaced literally, which means that dots at the end are important.
If you want to rename packages only, in most cases, you must ensure that you have an ending dot on both sides of a mapping (except for an empty mapping, if you use it), otherwise you may get unexpected results:
----
// Assuming the following arguments:
--rename com.foo.=x // Dot on the left only
--rename org.bar=y. // Dot on the right only
--rename net.baz=z // No dots
// The following renames will be made:
"com.foo.bar" -> "xbar" // Target prefix merged into the suffix
"org.bar.baz" -> "y..baz" // Double dot, invalid name
"net.baz.qux" -> "z.qux" // Looks okay, but...
"net.bazqux" -> "zqux" // ...may cut the name in the middle.
----
When computing the appropriate target name, the longest matching prefix is used:
----
// Assuming the following arguments:
--rename com.foo.Main=w.Main
--rename com.foo.=x.
--rename com.=y.
--rename =z.
// The following renames will be made:
com.foo.Main -> w.Main
com.foo.bar -> x.bar
com.baz.qux -> y.baz.qux
org.foo.bar -> z.org.foo.bar
----
Repeat this option to define multiple mappings.
Keys can be arbitrary strings, including an empty string.
Values must be valid dot-separated fully qualified class name prefixes, possibly terminated by a dot.
====
@@ -3,7 +3,6 @@
import org.pkl.config.java.ConfigEvaluator import org.pkl.config.java.ConfigEvaluator
import org.pkl.config.kotlin.forKotlin import org.pkl.config.kotlin.forKotlin
import org.pkl.config.kotlin.to import org.pkl.config.kotlin.to
import org.pkl.core.ModuleSource
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
// the pkl/pkl-examples repo has a similar example // the pkl/pkl-examples repo has a similar example
@@ -13,7 +12,7 @@ class KotlinConfigExample {
// tag::usage[] // tag::usage[]
val evaluator = ConfigEvaluator.preconfigured().forKotlin() // <1> val evaluator = ConfigEvaluator.preconfigured().forKotlin() // <1>
val config = evaluator.use { // <2> val config = evaluator.use { // <2>
it.evaluate(ModuleSource.text("""pigeon { age = 5; diet = new Listing { "Seeds" } }""")) it.evaluateText("""pigeon { age = 5; diet = "Seeds" }""")
} }
val pigeon = config["pigeon"] // <3> val pigeon = config["pigeon"] // <3>
val age = pigeon["age"].to<Int>() // <4> val age = pigeon["age"].to<Int>() // <4>
@@ -26,7 +25,7 @@ class KotlinConfigExample {
// tag::nullable[] // tag::nullable[]
val evaluator = ConfigEvaluator.preconfigured().forKotlin() val evaluator = ConfigEvaluator.preconfigured().forKotlin()
val config = evaluator.use { val config = evaluator.use {
it.evaluate(ModuleSource.text("name = null")) // <1> it.evaluateText("name = null") // <1>
} }
val name = config["name"].to<String?>() // <2> val name = config["name"].to<String?>() // <2>
// end::nullable[] // end::nullable[]
+22 -28
View File
@@ -19,7 +19,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
=== Java Library === Java Library
The `pkl-codegen-kotlin` library is available {uri-pkl-codegen-kotlin-maven-module}[from Maven Central]. The `pkl-codegen-kotlin` library is available {uri-pkl-codegen-kotlin-maven-module}[from Maven Central].
It requires Java 17 or higher and Kotlin 1.3 or higher. It requires Java 8 or higher and Kotlin 1.3 or higher.
==== Gradle ==== Gradle
@@ -27,42 +27,36 @@ To use the library in a Gradle project, declare the following dependency:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
implementation("org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}")
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
[source,groovy,subs="+attributes"] [source,groovy,subs="+attributes"]
---- ----
dependencies { dependencies {
implementation "org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}" compile "org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}"
} }
ifndef::is-release-build[]
repositories { repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
endif::[]
} }
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
endif::[]
---- ----
==== ====
@@ -109,7 +103,7 @@ To run the CLI, execute the library Jar or its `org.pkl.codegen.kotlin.Main` mai
*Synopsis:* `java -cp <classpath> -jar pkl-codegen-kotlin.jar [<options>] <modules>` *Synopsis:* `java -cp <classpath> -jar pkl-codegen-kotlin.jar [<options>] <modules>`
`<modules>`:: `<modules>`::
The absolute or relative URIs of the modules to generate classes for. The absolute or relative URIs of the modules to generate classe for.
Relative URIs are resolved against the working directory. Relative URIs are resolved against the working directory.
==== Options ==== Options
@@ -118,7 +112,7 @@ Relative URIs are resolved against the working directory.
[%collapsible] [%collapsible]
==== ====
Default: (flag not set) + Default: (flag not set) +
Flag that indicates to preserve Pkl doc comments by generating corresponding KDoc comments. Flag that indicates to generate Kdoc based on doc comments for Pkl modules, classes, and properties.
==== ====
Common code generator options: Common code generator options:
@@ -12,7 +12,7 @@ We recommend that Kotlin projects depend on this library instead of _pkl-config-
== Installation == Installation
The _pkl-config-kotlin_ library is available {uri-pkl-config-kotlin-maven-module}[from Maven Central]. The _pkl-config-kotlin_ library is available {uri-pkl-config-kotlin-maven-module}[from Maven Central].
It requires Java 17 or higher and Kotlin 1.5 or higher. It requires Java 11 or higher and Kotlin 1.5 or higher.
=== Gradle === Gradle
@@ -20,42 +20,36 @@ To use the library in a Gradle project, declare the following dependency:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
implementation("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
[source,groovy,subs="+attributes"] [source,groovy,subs="+attributes"]
---- ----
dependencies { dependencies {
implementation "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}" compile "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
} }
ifndef::is-release-build[]
repositories { repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
endif::[]
} }
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
endif::[]
---- ----
==== ====
@@ -72,7 +66,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-config-kotlin</artifactId> <artifactId>pkl-config-kotlin</artifactId>
<version>{pkl-artifact-version}</version> <version>{pkl-artifact-version}</version>
</dependency> </dependency>
ifndef::is-release-version[] ifndef::is-release-build[]
<repositories> <repositories>
<repository> <repository>
<id>sonatype-s01</id> <id>sonatype-s01</id>
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

@@ -134,7 +134,6 @@ exampleObjectWithMixedElements {
<2> Elements don't have to be literal values; they can be arbitrary _expressions_. <2> Elements don't have to be literal values; they can be arbitrary _expressions_.
<3> Elements can really be _any_ value, not just primitive values. <3> Elements can really be _any_ value, not just primitive values.
[[entries]]
=== Entries === Entries
Objects can have one more kind of member; _entries_. Objects can have one more kind of member; _entries_.
@@ -33,13 +33,13 @@ parrot = (bird) {
---- ----
Parrot and Pigeon have nearly identical properties. Parrot and Pigeon have nearly identical properties.
They only differ in their name and taxonomy, so if you have already written out `bird`, you can say that `parrot` is just like `bird` except `name` is `"Parrot"`, diet is `"Berries"` the `taxonomy.order` is `"Psittaciformes"`. They only differ in their name and taxonomy, so if you have already written out `bird`, you can say that `parrot` is just like `pigeon` except `name` is `"Parrot"`, diet is `"Berries"` the `taxonomy.order` is `"Psittaciformes"`.
When you run this, Pkl expands everything fully. When you run this, Pkl expands everything fully.
[source,{pkl}] [source,{pkl}]
---- ----
bird { bird {
name = "Pigeon" name = "Common wood pigeon"
diet = "Seeds" diet = "Seeds"
taxonomy { taxonomy {
kingdom = "Animalia" kingdom = "Animalia"
@@ -58,12 +58,9 @@ parrot {
} }
---- ----
[NOTE] [IMPORTANT]
==== ====
So far, you have only worked with link:{uri-stdlib-Dynamic}[Dynamic] objects. _Amending_ does not allow us to _add_ properties to the (typed) object we are amending.
Pkl also offers link:{uri-stdlib-Typed}[Typed] objects.
_Amending_ allows you to override, amend, and add new properties to a dynamic object.
Typed objects will only let you amend or override existing properties, not add entirely new ones.
The xref:03_writing_a_template.adoc[next part of the tutorial] discusses types in more detail. The xref:03_writing_a_template.adoc[next part of the tutorial] discusses types in more detail.
There, you see that amending _never changes the type_ of the object. There, you see that amending _never changes the type_ of the object.
==== ====
@@ -75,25 +72,22 @@ Consider the following example.
[source,{pkl}] [source,{pkl}]
.nestedAmends.pkl .nestedAmends.pkl
---- ----
stockPigeon { woodPigeon {
name = "Stock pigeon" name = "Common wood pigeon"
diet = "Seeds" diet = "Seeds"
taxonomy { taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Columba oenas"
}
}
woodPigeon = (stockPigeon) {
name = "Common wood pigeon"
taxonomy { // <1>
species = "Columba palumbus" species = "Columba palumbus"
} }
} }
dodo = (woodPigeon) { // <2> stockPigeon = (woodPigeon) {
name = "Stock pigeon"
taxonomy { // <1>
species = "Columba oenas"
}
}
dodo = (stockPigeon) { // <2>
name = "Dodo" name = "Dodo"
extinct = true // <3> extinct = true // <3>
taxonomy { taxonomy {
@@ -106,7 +100,7 @@ dodo = (woodPigeon) { // <2>
<3> New fields can be added to objects when amending. <3> New fields can be added to objects when amending.
Notice how you only have to change `taxonomy.species`. Notice how you only have to change `taxonomy.species`.
In this example, `stockPigeon.taxonomy` has `kingdom`, `clade`, `order` and `species`. In this example, `bird.taxonomy` has `kingdom`, `clade`, `order` and `species`.
You are amending `stockPigeon`, to define `woodPigeon`. You are amending `stockPigeon`, to define `woodPigeon`.
They have the same `taxonomy`, except for `species`. They have the same `taxonomy`, except for `species`.
This notation says that everything in `taxonomy` should be what it is in the object you are amending (`stockPigeon`), except for `species`, which should be `"Columba palumbus"` . This notation says that everything in `taxonomy` should be what it is in the object you are amending (`stockPigeon`), except for `species`, which should be `"Columba palumbus"` .
@@ -114,36 +108,27 @@ This notation says that everything in `taxonomy` should be what it is in the obj
For the input above, Pkl produces the following output. For the input above, Pkl produces the following output.
[source,{pkl}] [source,{pkl}]
---- ----
stockPigeon {
name = "Stock pigeon"
diet = "Seeds"
taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Columba oenas"
}
}
woodPigeon { woodPigeon {
name = "Common wood pigeon" name = "Common wood pigeon"
diet = "Seeds" diet = "Seeds"
taxonomy { taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Columba palumbus" species = "Columba palumbus"
} }
} }
stockPigeon {
name = "Stock pigeon"
diet = "Seeds"
taxonomy {
species = "Columba oenas"
}
}
dodo { dodo {
name = "Dodo" name = "Dodo"
diet = "Seeds" diet = "Seeds"
extinct = true
taxonomy { taxonomy {
kingdom = "Animalia"
clade = "Columbimorphae"
order = "Columbiformes"
species = "Raphus cucullatus" species = "Raphus cucullatus"
} }
extinct = true
} }
---- ----
@@ -213,7 +198,7 @@ adultBirdFoods {
A `.pkl` file describes a _module_. A `.pkl` file describes a _module_.
Modules are objects that can be referred to from other modules. Modules are objects that can be referred to from other modules.
Going back to the example above, you can write `pigeon` as a separate module. Going back to the example above, you can write `parrot` as a separate module.
[source,{pkl}] [source,{pkl}]
.pigeon.pkl .pigeon.pkl
@@ -221,8 +206,6 @@ Going back to the example above, you can write `pigeon` as a separate module.
name = "Common wood pigeon" name = "Common wood pigeon"
diet = "Seeds" diet = "Seeds"
taxonomy { taxonomy {
kingdom = "Animalia"
clade = "Dinosauria"
species = "Columba palumbus" species = "Columba palumbus"
} }
---- ----
@@ -242,7 +225,7 @@ parrot = (pigeon) {
} }
} }
---- ----
<1> Importing `pigeon.pkl` creates the object `pigeon`, so you can refer to `pigeon` in this code, like you did before. <1> Importing `foo.pkl` creates the object `foo`, so you can refer to `pigeon` in this code, like you did before.
If you run Pkl on both, you will see that it works. If you run Pkl on both, you will see that it works.
Looking at the result, however, you see a (possibly) unexpected difference. Looking at the result, however, you see a (possibly) unexpected difference.
@@ -253,8 +236,6 @@ $ pkl eval /Users/me/tutorial/pigeon.pkl
name = "Common wood pigeon" name = "Common wood pigeon"
diet = "Seeds" diet = "Seeds"
taxonomy { taxonomy {
kingdom = "Animalia"
clade = "Dinosauria"
species = "Columba palumbus" species = "Columba palumbus"
} }
@@ -263,8 +244,6 @@ parrot {
name = "Great green macaw" name = "Great green macaw"
diet = "Berries" diet = "Berries"
taxonomy { taxonomy {
kingdom = "Animalia"
clade = "Dinosauria"
species = "Ara ambiguus" species = "Ara ambiguus"
} }
} }
@@ -296,9 +275,9 @@ This terminology describes the _intended use_ of the module and doesn't imply an
In other words: just by looking at Pkl code, you can't tell whether it is a template or a "normal" module. In other words: just by looking at Pkl code, you can't tell whether it is a template or a "normal" module.
[source,{pkl}] [source,{pkl}]
.AcmeCICD.pkl .acmecicd.pkl
---- ----
module AcmeCICD module acmecicd
class Pipeline { class Pipeline {
name: String(nameRequiresBranchName)? name: String(nameRequiresBranchName)?
@@ -328,7 +307,7 @@ Next, add a time-out of one minute for your job.
[source,{pkl}] [source,{pkl}]
.cicd.pkl .cicd.pkl
---- ----
amends "AcmeCICD.pkl" amends "acmecicd.pkl"
timeout = 1 timeout = 1
---- ----
@@ -341,7 +320,7 @@ Value: 1 // <3>
225 | timeout: Int(this >= 3)? // <4> 225 | timeout: Int(this >= 3)? // <4>
^^^^^^^^^ ^^^^^^^^^
at AcmeCICD#timeout (file:///Users/me/tutorial/AcmeCICD.pkl, line 8) at acmecicd#timeout (file:///Users/me/tutorial/acmecicd.pkl, line 8)
3 | timeout = 1 // <5> 3 | timeout = 1 // <5>
^ ^
@@ -381,7 +360,7 @@ Start off by specifying the name of the pipeline and nothing else.
[source,{pkl}] [source,{pkl}]
.cicd.pkl .cicd.pkl
---- ----
amends "AcmeCICD.pkl" amends "acmecicd.pkl"
timeout = 3 timeout = 3
pipelines { pipelines {
@@ -393,7 +372,7 @@ pipelines {
<1> There is no pipeline object to amend. The `new` keyword gives you an object to amend. <1> There is no pipeline object to amend. The `new` keyword gives you an object to amend.
So far, you've defined objects the same way you amended them. So far, you've defined objects the same way you amended them.
If the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the contents in place of the `...` (given that `...` is not valid Pkl, but an abbreviation for illustration purposes). When the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the object specified on the `...`.
If `foo` is an existing object, this notation is an _amend expression_; resulting in a new _object_ (value), but _not_ a new (named) property. If `foo` is an existing object, this notation is an _amend expression_; resulting in a new _object_ (value), but _not_ a new (named) property.
Since `pipelines` is a listing, you can _add_ elements by writing expressions in an amend expression. Since `pipelines` is a listing, you can _add_ elements by writing expressions in an amend expression.
@@ -415,7 +394,7 @@ Pipelines that set a 'name' must also set a 'branchName'.
8 | throw("Pipelines that set a 'name' must also set a 'branchName'.") 8 | throw("Pipelines that set a 'name' must also set a 'branchName'.")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at AcmeCICD#Pipeline.nameRequiresBranchName.<function#1> (file:///Users/me/tutorial/AcmeCICD.pkl, line 8) at acmecicd#Pipeline.nameRequiresBranchName.<function#1> (file:///Users/me/tutorial/acmecicd.pkl, line 8)
6 | name = "prb" 6 | name = "prb"
^^^^^ ^^^^^
@@ -436,7 +415,7 @@ The message is quite instructive, so you can fix the error by adding a `branchNa
[source,{pkl}] [source,{pkl}]
.cicd.pkl .cicd.pkl
---- ----
amends "AcmeCICD.pkl" amends "acmecicd.pkl"
timeout = 3 timeout = 3
pipelines { pipelines {
@@ -3,7 +3,7 @@ include::ROOT:partial$component-attributes.adoc[]
In parts xref:01_basic_config.adoc[one] and xref:02_filling_out_a_template.adoc[two], you saw that Pkl provides _validation_ of our configurations. In parts xref:01_basic_config.adoc[one] and xref:02_filling_out_a_template.adoc[two], you saw that Pkl provides _validation_ of our configurations.
It checks syntax, types and constraints. It checks syntax, types and constraints.
As you saw in the `AcmeCICD` example xref:02_filling_out_a_template.adoc#amending-templates[here], the template can provide informative error messages when an amending module violates a type constraint. As you saw in the `acmecicd` example xref:02_filling_out_a_template.adoc#amending-templates[here], the template can provide informative error messages when an amending module violates a type constraint.
In this final part, you will see some of Pkl's techniques that are particularly relevant for writing a template. In this final part, you will see some of Pkl's techniques that are particularly relevant for writing a template.
@@ -30,7 +30,7 @@ amountLearned: Float = 13.37
duration: Duration = 30.min duration: Duration = 30.min
bandwidthRequirementPerSecond: DataSize = 52.4288.mb bandwidthRequirementPerSecond: DataSize = 50.mb
---- ----
In the above, you've explicitly annotated the code with type signatures. In the above, you've explicitly annotated the code with type signatures.
@@ -45,7 +45,7 @@ part = 3
hasExercises = true hasExercises = true
amountLearned = 13.37 amountLearned = 13.37
duration = 30.min duration = 30.min
bandwidthRequirementPerSecond = 52.4288.mb bandwidthRequirementPerSecond = 50.mb
---- ----
Note how `Duration` and `DataSize` help you prevent https://en.wikipedia.org/wiki/Mars_Climate_Orbiter[unit errors] in these common (for configuration) domains. Note how `Duration` and `DataSize` help you prevent https://en.wikipedia.org/wiki/Mars_Climate_Orbiter[unit errors] in these common (for configuration) domains.
@@ -146,7 +146,7 @@ pklTutorialPart1 {
hasExercises = true hasExercises = true
amountLearned = 13.37 amountLearned = 13.37
duration = 30.min duration = 30.min
bandwidthRequirementPerSecond = 52.4288.mb bandwidthRequirementPerSecond = 50.mb
} }
pklTutorialPart2 { pklTutorialPart2 {
name = "Filling out a Template" name = "Filling out a Template"
@@ -154,7 +154,7 @@ pklTutorialPart2 {
hasExercises = true hasExercises = true
amountLearned = 13.37 amountLearned = 13.37
duration = 30.min duration = 30.min
bandwidthRequirementPerSecond = 52.4288.mb bandwidthRequirementPerSecond = 50.mb
} }
pklTutorialPart3 { pklTutorialPart3 {
name = "Writing a Template" name = "Writing a Template"
@@ -162,12 +162,12 @@ pklTutorialPart3 {
hasExercises = true hasExercises = true
amountLearned = 13.37 amountLearned = 13.37
duration = 30.min duration = 30.min
bandwidthRequirementPerSecond = 52.4288.mb bandwidthRequirementPerSecond = 50.mb
} }
---- ----
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorialPart3.pkl`. Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorial.pkl`.
It creates a separate `class TutorialPart` and instantiates three properties with it (`pklTutorialPart1`, `pklTutorialPart2` and `pklTutorialPart3`). It creates a separate `class TutorialPart` and instantiates three properties with it (`pklTutorialPart1`, `pklTutorialPart2` and `pklTutorialPart3`).
In doing so, it implicitly moves everything "down" one level (`pklTutorialPart3` is now a property in the module `pklTutorialParts`, whereas above, in `pklTutorialPart3.pkl` it was its own module). In doing so, it implicitly moves everything "down" one level (`pklTutorialPart3` is now a property in the module `pklTutorialParts`, whereas above, in `pklTutorialPart3.pkl` it was its own module).
This is not very DRY. This is not very DRY.
@@ -199,7 +199,7 @@ amountLearned: Float = 13.37 // <2>
duration: Duration = 30.min // <2> duration: Duration = 30.min // <2>
bandwidthRequirementPerSecond: DataSize = 52.4288.mb // <2> bandwidthRequirementPerSecond: DataSize = 50.mb // <2>
---- ----
<1> No default value given. <1> No default value given.
<2> Default value given. <2> Default value given.
@@ -239,7 +239,7 @@ part = 3
hasExercises = true hasExercises = true
amountLearned = 13.37 amountLearned = 13.37
duration = 30.min duration = 30.min
bandwidthRequirementPerSecond = 52.4288.mb bandwidthRequirementPerSecond = 50.mb
---- ----
@@ -256,13 +256,13 @@ By "precisely" we mean, that amending an object also can't "turn it into" an ins
== A new template == A new template
Now that you know about types, you can start writing your first template. Now that you know about types, you can start writing your first template.
So far, you've written configurations with Pkl, either without a template, or using the `AcmeCICD` template from xref:02_filling_out_a_template.adoc#amending-templates[Amending templates]. So far, you've written configurations with Pkl, either without a template, or using the `acmecicd` template from xref:02_filling_out_a_template.adoc#amending-templates[Amending templates].
It is often easiest to first write a (typical) configuration for which you want to create a template. It is often easiest to first write a (typical) configuration for which you want to create a template.
Suppose you want to define what a live workshop for this tutorial looks like. Suppose you want to define what a live workshop for this tutorial looks like.
Consider this example: Consider this example:
[source,{pkl}] [source,{pkl}]
.workshop2024.pkl .workshop2023.pkl
---- ----
title = "Pkl: Configure your Systems in New Ways" title = "Pkl: Configure your Systems in New Ways"
interactive = true interactive = true
@@ -278,7 +278,7 @@ duration = 1.5.h
event { event {
name = "Migrating Birds between hemispheres" name = "Migrating Birds between hemispheres"
year = 2024 year = 2023
} }
instructors { instructors {
@@ -288,11 +288,11 @@ instructors {
sessions { sessions {
new { new {
date = "2/1/2024" date = "8/14/2023"
time = 30.min time = 30.min
} }
new { new {
date = "2/1/2024" date = "8/15/2023"
time = 30.min time = 30.min
} }
} }
+55 -220
View File
@@ -1,16 +1,13 @@
= CLI = CLI
include::ROOT:partial$component-attributes.adoc[] include::ROOT:partial$component-attributes.adoc[]
:uri-homebrew: https://brew.sh :uri-homebrew: https://brew.sh
:uri-mise: https://mise.jdx.dev
:uri-sonatype-snapshot-download: https://s01.oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.pkl-lang&v={pkl-artifact-version} :uri-pkl-macos-amd64-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-macos-amd64/{pkl-artifact-version}/pkl-cli-macos-amd64-{pkl-artifact-version}.bin
:uri-pkl-macos-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-amd64&e=bin :uri-pkl-macos-aarch64-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-macos-aarch64/{pkl-artifact-version}/pkl-cli-macos-aarch64-{pkl-artifact-version}.bin
:uri-pkl-macos-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-aarch64&e=bin :uri-pkl-linux-amd64-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-linux-amd64/{pkl-artifact-version}/pkl-cli-linux-amd64-{pkl-artifact-version}.bin
:uri-pkl-linux-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-amd64&e=bin :uri-pkl-linux-aarch64-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-linux-aarch64/{pkl-artifact-version}/pkl-cli-linux-aarch64-{pkl-artifact-version}.bin
:uri-pkl-linux-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-aarch64&e=bin :uri-pkl-alpine-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-alpine-linux-amd64/{pkl-artifact-version}/pkl-cli-alpine-linux-amd64-{pkl-artifact-version}.bin
:uri-pkl-alpine-download: {uri-sonatype-snapshot-download}&a=pkl-cli-alpine-linux-amd64&e=bin :uri-pkl-java-download: https://repo1.maven.org/maven2/org/pkl-lang/pkl-cli-java/{pkl-artifact-version}/pkl-cli-java-{pkl-artifact-version}.jar
:uri-pkl-windows-download: {uri-sonatype-snapshot-download}&a=pkl-cli-windows-amd64&e=exe
:uri-pkl-java-download: {uri-sonatype-snapshot-download}&a=pkl-cli-java&e=jar
ifdef::is-release-version[] ifdef::is-release-version[]
:uri-pkl-macos-amd64-download: {github-releases}/pkl-macos-amd64 :uri-pkl-macos-amd64-download: {github-releases}/pkl-macos-amd64
@@ -18,7 +15,6 @@ ifdef::is-release-version[]
:uri-pkl-linux-amd64-download: {github-releases}/pkl-linux-amd64 :uri-pkl-linux-amd64-download: {github-releases}/pkl-linux-amd64
:uri-pkl-linux-aarch64-download: {github-releases}/pkl-linux-aarch64 :uri-pkl-linux-aarch64-download: {github-releases}/pkl-linux-aarch64
:uri-pkl-alpine-download: {github-releases}/pkl-alpine-linux-amd64 :uri-pkl-alpine-download: {github-releases}/pkl-alpine-linux-amd64
:uri-pkl-windows-download: {github-releases}/pkl-windows-amd64.exe
:uri-pkl-java-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-java/{pkl-artifact-version}/pkl-cli-java-{pkl-artifact-version}.jar :uri-pkl-java-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-java/{pkl-artifact-version}/pkl-cli-java-{pkl-artifact-version}.jar
endif::[] endif::[]
@@ -26,7 +22,6 @@ endif::[]
:uri-pkl-cli-main-sources: {uri-github-tree}/pkl-cli/src/main/kotlin/org/pkl/cli :uri-pkl-cli-main-sources: {uri-github-tree}/pkl-cli/src/main/kotlin/org/pkl/cli
:uri-pkl-cli-CliEvaluatorOptions: {uri-pkl-cli-main-sources}/CliEvaluatorOptions.kt :uri-pkl-cli-CliEvaluatorOptions: {uri-pkl-cli-main-sources}/CliEvaluatorOptions.kt
:uri-certificates: {uri-github-tree}/pkl-commons-cli/src/main/resources/org/pkl/commons/cli/commands :uri-certificates: {uri-github-tree}/pkl-commons-cli/src/main/resources/org/pkl/commons/cli/commands
:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/
The `pkl` command-line interface (CLI) evaluates Pkl modules and writes their output to the console or a file. The `pkl` command-line interface (CLI) evaluates Pkl modules and writes their output to the console or a file.
For interactive development, the CLI includes a Read-Eval-Print Loop (REPL). For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
@@ -37,13 +32,12 @@ For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
The CLI comes in multiple flavors: The CLI comes in multiple flavors:
* Native macOS executable for amd64 (tested on macOS 10.15) * Native macOS executable for amd64 (tested on macOS 10.15)
* Native Linux executable for amd64 * Native Linux executable for amd64 (tested on Oracle Linux 8)
* Native Linux executable for aarch64 * Native Linux executable for aarch64 (tested on Oracle Linux 8)
* Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8) * Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8)
* Native Windows executable for amd64 (tested on Windows Server 2022) * Java executable (tested with Java 8/11/14 on macOS and Oracle Linux)
* Java executable (tested with Java 17/21 on macOS and Oracle Linux)
On macOS, Linux, and Windows, we recommend using the native executables. On macOS and Linux, we recommend using the native executables.
They are self-contained, start up instantly, and run complex Pkl code much faster than the Java executable. They are self-contained, start up instantly, and run complex Pkl code much faster than the Java executable.
.What is the Difference Between the Linux and Alpine Linux Executables? .What is the Difference Between the Linux and Alpine Linux Executables?
@@ -54,59 +48,38 @@ whereas, the Alpine Linux executable is statically linked against _musl libc_ an
==== ====
The Java executable works on multiple platforms and has a smaller binary size than the native executables. The Java executable works on multiple platforms and has a smaller binary size than the native executables.
However, it requires a Java 17 (or higher) runtime on the system path, and has a noticeable startup delay. However, it requires a Java 8 (or higher) runtime on the system path, has a noticeable startup delay,
and runs complex Pkl code slower than the native executables.
All flavors are built from the same codebase and undergo the same automated testing. All flavors are built from the same codebase and undergo the same automated testing.
Except where noted otherwise, the rest of this page discusses the native executables. Except where noted otherwise, the rest of this page discusses the native executables.
[[homebrew]] //TODO uncomment this after brew formula is merged and available
=== Homebrew // [[homebrew]]
// === Homebrew
On macOS and Linux, release versions can be installed with {uri-homebrew}[Homebrew]. //
// Release versions can be installed with {uri-homebrew}[Homebrew].
ifdef::is-release-version[] //
To install Pkl, run: // ifdef::is-release-version[]
// To install Pkl, run:
[source,shell] //
---- // [source,shell]
brew install pkl // ----
---- // brew install pkl
// ----
To update Pkl, run: //
// To update Pkl, run:
[source,shell] //
---- // [source,shell]
brew update // ----
brew upgrade pkl # or just `brew upgrade` // brew update
---- // brew upgrade pkl # or just `brew upgrade`
endif::[] // ----
// endif::[]
ifndef::is-release-version[] //
For instructions, switch to a release version of this page. // ifndef::is-release-version[]
endif::[] // For instructions, switch to a release version of this page.
// endif::[]
[[mise]]
=== Mise
On macOS, Linux, and Windows, release versions can be installed with {uri-mise}[Mise].
ifdef::is-release-version[]
To install Pkl, run:
[source,shell]
[subs="+attributes"]
----
# Install and activate Pkl globally
mise use -g pkl@{pkl-version}
# Install and activate Pkl locally
mise use pkl@{pkl-version}
----
endif::[]
ifndef::is-release-version[]
For instructions, switch to a release version of this page.
endif::[]
[[download]] [[download]]
=== Download === Download
@@ -120,7 +93,7 @@ On aarch64:
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
curl -L -o pkl '{uri-pkl-macos-aarch64-download}' curl -L -o pkl {uri-pkl-macos-aarch64-download}
chmod +x pkl chmod +x pkl
./pkl --version ./pkl --version
---- ----
@@ -130,14 +103,14 @@ On amd64:
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
curl -L -o pkl '{uri-pkl-macos-amd64-download}' curl -L -o pkl {uri-pkl-macos-amd64-download}
chmod +x pkl chmod +x pkl
./pkl --version ./pkl --version
---- ----
This should print something similar to: This should print something similar to:
[source] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
Pkl {pkl-version} (macOS, native) Pkl {pkl-version} (macOS, native)
@@ -154,7 +127,7 @@ On aarch64:
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
curl -L -o pkl '{uri-pkl-linux-aarch64-download}' curl -L -o pkl {uri-pkl-linux-aarch64-download}
chmod +x pkl chmod +x pkl
./pkl --version ./pkl --version
---- ----
@@ -164,14 +137,14 @@ On amd64:
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
curl -L -o pkl '{uri-pkl-linux-amd64-download}' curl -L -o pkl {uri-pkl-linux-amd64-download}
chmod +x pkl chmod +x pkl
./pkl --version ./pkl --version
---- ----
This should print something similar to: This should print something similar to:
[source] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
Pkl {pkl-version} (Linux, native) Pkl {pkl-version} (Linux, native)
@@ -186,14 +159,14 @@ For a dynamically linked executable, see <<Linux Executable>>.
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
curl -L -o pkl '{uri-pkl-alpine-download}' curl -L -o pkl {uri-pkl-alpine-download}
chmod +x pkl chmod +x pkl
./pkl --version ./pkl --version
---- ----
This should print something similar to: This should print something similar to:
[source] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
Pkl {pkl-version} (Linux, native) Pkl {pkl-version} (Linux, native)
@@ -201,65 +174,24 @@ Pkl {pkl-version} (Linux, native)
NOTE: We currently do not support the aarch64 architecture for Alpine Linux. NOTE: We currently do not support the aarch64 architecture for Alpine Linux.
[[windows-executable]]
=== Windows Executable
[source,PowerShell]
[subs="+attributes"]
----
Invoke-WebRequest '{uri-pkl-windows-download}' -OutFile pkl.exe
.\pkl --version
----
This should print something similar to:
[source]
[subs="+attributes"]
----
Pkl {pkl-version} (Windows 10.0, native)
----
NOTE: We currently do not support the aarch64 architecture for Windows.
[[java-executable]]
=== Java Executable === Java Executable
The Java executable is a jar that can be executed directly on macOS, Linux, and Windows.
It requires `java` to be installed, and available on `$PATH`.
[tabs]
====
macOS/Linux::
+
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
curl -L -o jpkl '{uri-pkl-java-download}' curl -L -o jpkl {uri-pkl-java-download}
chmod +x jpkl chmod +x jpkl
./jpkl --version ./jpkl --version
---- ----
Windows::
+
[source,PowerShell]
[subs="+attributes"]
----
Invoke-WebRequest '{uri-pkl-java-download}' -OutFile jpkl.bat
.\jpkl --version
----
====
This should print something similar to: This should print something similar to:
[source,shell] [source,shell]
[subs="+attributes"] [subs="+attributes"]
---- ----
Pkl {pkl-version} (macOS 14.2, Java 17.0.10) Pkl {pkl-version} (macOS 10.16, Java 11.0.9)
---- ----
NOTE: The Java executable is named `jpkl`.
[[usage]] [[usage]]
== Usage == Usage
@@ -434,7 +366,7 @@ This command also takes <<common-options, common options>>.
[[command-server]] [[command-server]]
=== `pkl server` === `pkl server`
*Synopsis:* `pkl server` *Synopsys:* `pkl server`
Run as a server that communicates over standard input/output. Run as a server that communicates over standard input/output.
@@ -443,16 +375,12 @@ This option is used for embedding Pkl in an external client, such as xref:swift:
[[command-test]] [[command-test]]
=== `pkl test` === `pkl test`
*Synopsis:* `pkl test [<options>] [<modules>]` *Synopsys:* `pkl test [<options>] [<modules>]`
Evaluate the given `<modules>` as _tests_, producing a test report and appropriate exit code. Evaluate the given `<modules>` as _tests_, producing a test report and appropriate exit code.
Renderers defined in test files will be ignored by the `test` command. Renderers defined in test files will be ignored by the `test` command.
Tests that result in writing `pkl-expected.pcf` files are considered failing tests.
If these are the only failures, the command exits with exit code 10.
Otherwise, failures result in exit code 1.
<modules>:: <modules>::
The absolute or relative URIs of the modules to test. Relative URIs are resolved against the working directory. The absolute or relative URIs of the modules to test. Relative URIs are resolved against the working directory.
@@ -482,7 +410,7 @@ This command also takes <<common-options, common options>>.
[[command-repl]] [[command-repl]]
=== `pkl repl` === `pkl repl`
*Synopsis:* `pkl repl [<options>]` *Synopsys:* `pkl repl [<options>]`
Start a REPL session. Start a REPL session.
@@ -602,64 +530,14 @@ package already exists in the cache directory, this command is a no-op.
This command accepts <<common-options,common options>>. This command accepts <<common-options,common options>>.
[[command-analyze-imports]]
=== `pkl analyze imports`
*Synopsis*: `pkl analyze imports [<modules>]`
This command builds a graph of imports declared in the provided modules.
This is a lower level command that is meant to be useful for Pkl-related tooling.
For example, this command feeds into the xref:pkl-gradle:index.adoc[] to determine if tasks are considered up-to-date or not.
This command produces an object with two properties, `imports` and `resolvedImports`.
The `imports` property is a mapping of a module's absolute URI, to the set of imports declared within that module.
The `resolvedImports` property is a mapping of a module's absolute URI (as stated in `imports`), to the resolved absolute URI that might be useful for fetching the module's contents.
For example, a xref:language-reference:index.adoc#local-dependencies[local dependency] import will have an in-language URI with scheme `projectpackage:`, and may have resolved URI with scheme `file:` (assuming that the project is file-based).
Examples:
[source,shell]
----
# Analyze the imports of a single module
pkl analyze imports myModule.pkl
# Same as the previous command, but output in JSON.
pkl analyze imports -f json myModule.pkl
# Analyze imports of all modules declared within src/
pkl analyze imports src/*.pkl
----
<modules>::
The absolute or relative URIs of the modules to analyze. Relative URIs are resolved against the working directory.
==== Options
.-f, --format
[%collapsible]
====
Same meaning as <<format>> in <<command-eval>>.
====
.-o, --output-path
[%collapsible]
====
Same meaning as <<output-path>> in <<command-eval>>.
====
This command also takes <<common-options,common options>>.
[[common-options]] [[common-options]]
=== Common options === Common options
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-project-resolve>>, <<command-project-package>>, <<command-download-package>>, and <<command-analyze-imports>> commands support the following common options: The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-project-resolve>>, <<command-project-package>>, and <<command-download-package>> commands support the following common options:
include::../../pkl-cli/partials/cli-common-options.adoc[] include::../../pkl-cli/partials/cli-common-options.adoc[]
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-download-package>>, and <<command-analyze-imports>> commands also take the following options: The <<command-eval>>, <<command-test>>, <<command-repl>>, and <<command-download-package>> commands also take the following options:
include::../../pkl-cli/partials/cli-project-options.adoc[] include::../../pkl-cli/partials/cli-project-options.adoc[]
@@ -761,6 +639,8 @@ Type :help or :examples for more information.
pkl> pkl>
---- ----
NOTE: The Java executable is named `jpkl`.
=== Loading Modules === Loading Modules
To load <<config.pkl,`config.pkl`>> into the REPL, run: To load <<config.pkl,`config.pkl`>> into the REPL, run:
@@ -923,48 +803,3 @@ These certificates can be overridden via either of the two options:
Both these options will *replace* the default CA certificates bundled with Pkl. + Both these options will *replace* the default CA certificates bundled with Pkl. +
The CLI option takes precedence over the certificates in `~/.pkl/cacerts/`. + The CLI option takes precedence over the certificates in `~/.pkl/cacerts/`. +
Certificates need to be X.509 certificates in PEM format. Certificates need to be X.509 certificates in PEM format.
[[http-proxy]]
== HTTP Proxying
When making HTTP(s) requests, Pkl can possibly make use of an HTTP proxy.
There are two values that determine proxy settings; the proxy address and list of noproxy rules.
When determining proxy settings, Pkl will look at the following locations, in order of precedence (lowest to highest):
1. OS settings (on macOS, Windows, and GNOME environments)
2. <<settings-file,Settings file>>
3. xref:language-reference:index.adoc#projects[PklProject file]
4. `--http-proxy` and `--http-no-proxy` CLI flags
[NOTE]
====
The proxy and noproxy values are individually set.
For example, using the `--http-no-proxy` flag but not the `--http-proxy` flag will cause Pkl to look at the PklProject file, then the settings file, then system settings for the proxy address.
One exception to this rule is that setting a proxy address will cause Pkl to ignore any noproxy values set at the OS level.
====
Pkl only supports HTTP proxies, so neither HTTPS nor SOCKS proxies are supported.
Pkl does not support authentication with a proxy.
When specifying a proxy address, it must have scheme `http`, and may not contain anything other than a host and port.
=== Proxy exclusions
Pkl can be configured to bypass the proxy for specific requests via a proxy exclusion rule (i.e. the `--http-no-proxy` flag).
It may be provided either as a hostname, an IP address, or an IP range via https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].
When determining whether a proxy should be excluded, hostnames do not get resolved to their IP address.
For example, a request to `localhost` will not match `--http-no-proxy=127.0.0.1`.
For individual hosts (not CIDRs), ports can be specified.
When no port is specified for a given host, connections to all ports bypass the proxy.
A hostname will match all of its subdomains.
For example, `example.com` will match `foo.example.com`, and `bar.foo.example.com`, but not `fooexample.com`.
The value `*` is a special wildcard that matches all hosts.
A port can optionally be specified. If omitted, it matches all ports.
NOTE: Pkl follows the rules described in https://about.gitlab.com/blog/2021/01/27/we-need-to-talk-no-proxy/#standardizing-no_proxy[Standardizing `no_proxy`], except it does not look at environment variables.
@@ -7,6 +7,7 @@ Comma-separated list of URI patterns that determine which modules can be loaded
Patterns are matched against the beginning of module URIs. Patterns are matched against the beginning of module URIs.
(File paths have been converted to `file:` URLs at this stage.) (File paths have been converted to `file:` URLs at this stage.)
At least one pattern needs to match for a module to be loadable. At least one pattern needs to match for a module to be loadable.
Both source modules and transitive modules are subject to this check.
==== ====
[[allowed-resources]] [[allowed-resources]]
@@ -19,19 +20,6 @@ Patterns are matched against the beginning of resource URIs.
At least one pattern needs to match for a resource to be readable. At least one pattern needs to match for a resource to be readable.
==== ====
[[color]]
.--color
[%collapsible]
====
Default: `auto` +
When to format messages with ANSI color codes.
Possible values:
- `"never"`: Never format
- `"auto"`: Format if `stdin`, `stdout`, or `stderr` are connected to a console.
- `"always"`: Always format
====
[[cache-dir]] [[cache-dir]]
.--cache-dir .--cache-dir
[%collapsible] [%collapsible]
@@ -44,7 +32,7 @@ The cache directory for storing packages.
.--no-cache .--no-cache
[%collapsible] [%collapsible]
==== ====
Disable caching of packages. Disable cacheing of packages.
==== ====
.-e, --env-var .-e, --env-var
@@ -134,21 +122,3 @@ Certificates need to be X.509 certificates in PEM format.
For other methods of configuring certificates, see xref:pkl-cli:index.adoc#ca-certs[CA Certificates]. For other methods of configuring certificates, see xref:pkl-cli:index.adoc#ca-certs[CA Certificates].
==== ====
.--http-proxy
[%collapsible]
====
Default: (none) +
Example: `\http://proxy.example.com:1234` +
Configures HTTP connections to connect to the provided proxy address.
The URI must have scheme `http`, and may not contain anything other than a host and port.
====
.--http-no-proxy
[%collapsible]
====
Default: (none) +
Example: `example.com,169.254.0.0/16` +
Comma separated list of hosts to which all connections should bypass the proxy.
Hosts can be specified by name, IP address, or IP range using https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].
====
+21 -27
View File
@@ -22,7 +22,7 @@ The library can also be used to embed Pkl in Java libraries and applications.
== Installation == Installation
The _pkl-core_ library is available {uri-pkl-core-maven-module}[from Maven Central]. The _pkl-core_ library is available {uri-pkl-core-maven-module}[from Maven Central].
It requires Java 17 or higher. It requires Java 11 or higher.
=== Gradle === Gradle
@@ -30,42 +30,36 @@ To use the library in a Gradle project, declare the following dependency:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
implementation("org.pkl-lang:pkl-core:{pkl-artifact-version}")
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
[source,groovy,subs="+attributes"] [source,groovy,subs="+attributes"]
---- ----
dependencies { dependencies {
implementation "org.pkl-lang:pkl-core:{pkl-artifact-version}" compile "org.pkl-lang:pkl-core:{pkl-artifact-version}"
} }
ifndef::is-release-build[]
repositories { repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
endif::[]
} }
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-core:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
endif::[]
---- ----
==== ====
@@ -82,7 +76,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-core</artifactId> <artifactId>pkl-core</artifactId>
<version>{pkl-artifact-version}</version> <version>{pkl-artifact-version}</version>
</dependency> </dependency>
ifndef::is-release-version[] ifndef::is-release-build[]
<repositories> <repositories>
<repository> <repository>
<id>sonatype-s01</id> <id>sonatype-s01</id>
+23 -37
View File
@@ -74,7 +74,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the _Gradle Plugin_
=== Java Library === Java Library
The `pkl-doc` library is available {uri-pkl-doc-maven}[from Maven Central]. The `pkl-doc` library is available {uri-pkl-doc-maven}[from Maven Central].
It requires Java 17 or higher. It requires Java 11 or higher.
ifndef::is-release-version[] ifndef::is-release-version[]
NOTE: Snapshots are published to repository `{uri-sonatype}`. NOTE: Snapshots are published to repository `{uri-sonatype}`.
@@ -86,42 +86,36 @@ To use the library in a Gradle project, declare the following dependency:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
implementation("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
}
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
[source,groovy,subs="+attributes"] [source,groovy,subs="+attributes"]
---- ----
dependencies { dependencies {
implementation "org.pkl-lang:pkl-doc:{pkl-artifact-version}" compile "org.pkl-lang:pkl-doc:{pkl-artifact-version}"
} }
ifndef::is-release-build[]
repositories { repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
endif::[]
} }
endif::[]
----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
dependencies {
compile("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
}
ifndef::is-release-build[]
repositories {
maven { url = uri("{uri-sonatype}") }
}
endif::[]
---- ----
==== ====
@@ -138,7 +132,7 @@ To use the library in a Maven project, declare the following dependency:
<artifactId>pkl-doc</artifactId> <artifactId>pkl-doc</artifactId>
<version>{pkl-artifact-version}</version> <version>{pkl-artifact-version}</version>
</dependency> </dependency>
ifndef::is-release-version[] ifndef::is-release-build[]
<repositories> <repositories>
<repository> <repository>
<id>sonatype-s01</id> <id>sonatype-s01</id>
@@ -162,7 +156,7 @@ We recommend to provision it with a Maven compatible build tool as shown in <<in
The Pkldoc tool is offered as Gradle plugin, Java library, and CLI. The Pkldoc tool is offered as Gradle plugin, Java library, and CLI.
It can generate documentation either for modules directly, or generate documentation for _package uris_. It can generate documentation either for modules directly, or generate documentation for _package uris_.
The tool requires an argument of a module named _docsite-info.pkl_, that amends link:{uri-DocsiteInfo}[pkl.DocsiteInfo]. The tool requires an argument of a module named `_docsite-info.pkl`, that amends link:{uri-DocsiteInfo}[pkl.DocsiteInfo].
[discrete] [discrete]
==== Generating documentation for modules directly ==== Generating documentation for modules directly
@@ -232,18 +226,10 @@ Relative URIs are resolved against the working directory.
[%collapsible] [%collapsible]
==== ====
Default: (none) + Default: (none) +
Example: `pkldoc` + Example: `pkldoc`
The directory where generated documentation is placed. The directory where generated documentation is placed.
==== ====
.--no-symlinks
[%collapsible]
====
Create copies of files and directories instead of symbolic links.
In particular, this affects how the "current" directories containing documentation content for the last generated version should be created.
By default, a symbolic link is created pointing to the last generated version. If symlinks are disabled, a full copy of the last generated version is created.
====
Common CLI options: Common CLI options:
include::../../pkl-cli/partials/cli-common-options.adoc[] include::../../pkl-cli/partials/cli-common-options.adoc[]
+43 -126
View File
@@ -21,7 +21,7 @@ That is, plugin version `x.y.z` uses Pkl version `x.y.z`.
== Installation == Installation
The Gradle plugin is available {uri-pkl-gradle-maven-module}[from Maven Central]. The Gradle plugin is available {uri-pkl-gradle-maven-module}[from Maven Central].
It requires Java 17 or higher and Gradle 8.1 or higher. It requires Java 11 or higher and Gradle 6.8 or higher.
Earlier Gradle versions are not supported. Earlier Gradle versions are not supported.
ifndef::is-release-version[] ifndef::is-release-version[]
@@ -32,31 +32,6 @@ The plugin is applied as follows:
[tabs] [tabs]
==== ====
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
plugins {
id("org.pkl-lang") version "{pkl-artifact-version}"
}
----
+
.settings.gradle.kts
[source,kotlin,subs="+attributes"]
----
pluginManagement {
repositories {
ifdef::is-release-version[]
mavenCentral()
endif::[]
ifndef::is-release-version[]
maven(url = "{uri-sonatype}")
endif::[]
}
}
----
Groovy:: Groovy::
+ +
.build.gradle .build.gradle
@@ -72,15 +47,40 @@ plugins {
---- ----
pluginManagement { pluginManagement {
repositories { repositories {
ifdef::is-release-version[] ifdef::is-release-build[]
mavenCentral() mavenCentral()
endif::[] endif::[]
ifndef::is-release-version[] ifndef::is-release-build[]
maven { url "{uri-sonatype}" } maven { url "{uri-sonatype}" }
endif::[] endif::[]
} }
} }
---- ----
Kotlin::
+
.build.gradle.kts
[source,kotlin,subs="+attributes"]
----
plugins {
id("org.pkl-lang") version "{pkl-artifact-version}"
}
----
+
.settings.gradle.kts
[source,kotlin,subs="+attributes"]
----
pluginManagement {
repositories {
ifdef::is-release-build[]
mavenCentral()
endif::[]
ifndef::is-release-build[]
maven { url = uri("{uri-sonatype}") }
endif::[]
}
}
----
==== ====
[[module-evaluation]] [[module-evaluation]]
@@ -102,6 +102,7 @@ pkl {
evaluators { evaluators {
evalPkl { evalPkl {
sourceModules.add(file("module1.pkl")) sourceModules.add(file("module1.pkl"))
transitiveModules.from file("module2.pkl")
outputFile = layout.buildDirectory.file("module1.yaml") outputFile = layout.buildDirectory.file("module1.yaml")
outputFormat = "yaml" outputFormat = "yaml"
} }
@@ -117,6 +118,7 @@ pkl {
evaluators { evaluators {
register("evalPkl") { register("evalPkl") {
sourceModules.add(file("module1.pkl")) sourceModules.add(file("module1.pkl"))
transitiveModules.from(file("module2.pkl"))
outputFile.set(layout.buildDirectory.file("module1.yaml")) outputFile.set(layout.buildDirectory.file("module1.yaml"))
outputFormat.set("yaml") outputFormat.set("yaml")
} }
@@ -125,6 +127,9 @@ pkl {
---- ----
==== ====
To guarantee correct Gradle up-to-date behavior,
`transitiveModules` needs to contain all module files transitively referenced by `sourceModules`.
For each declared evaluator, the Pkl plugin creates an equally named task. For each declared evaluator, the Pkl plugin creates an equally named task.
Hence the above evaluator can be run with: Hence the above evaluator can be run with:
@@ -373,26 +378,14 @@ Example: `generateGetters = true` +
Whether to generate private final fields and public getter methods rather than public final fields. Whether to generate private final fields and public getter methods rather than public final fields.
==== ====
.paramsAnnotation: Property<String> // TODO: fixme (paramsAnnotation, nonNullAnnotation)
.preferJavaxInjectAnnotation: Boolean
[%collapsible] [%collapsible]
==== ====
Default: `null` if `generateSpringBootConfig` is `true`, `"org.pkl.config.java.mapper.Named"` otherwise+ Default: `false` +
Example: `paramsAnnotation = "org.project.MyAnnotation"` + Example: `preferJavaxInjectAnnotation = true` +
Fully qualified name of the annotation type to use for annotating constructor parameters with their name. + Whether to annotate constructor parameters with `@javax.inject.Named` instead of `@org.pkl.config.java.mapper.Named`.
The specified annotation type must have a `value` parameter of type `String` or the generated code may not compile. If `true`, the generated code will have a compile dependency on `javax.inject:javax.inject:1`.
If set to `null`, constructor parameters are not annotated.
Whether and how constructor parameters should be annotated depends on the library that instantiates the generated classes.
For Spring Boot applications, and for users of `pkl-config-java` compiling the generated classes with `-parameters`, no annotation is required.
====
.nonNullAnnotation: Property<String>
[%collapsible]
====
Default: `"org.pkl.config.java.mapper.NonNull"` +
Example: `nonNullAnnotation = "org.project.MyAnnotation"` +
Fully qualified name of the annotation type to use for annotating non-null types. +
The specified annotation type must be annotated with `@java.lang.annotation.Target(ElementType.TYPE_USE)`
or the generated code may not compile.
==== ====
Common code generation properties: Common code generation properties:
@@ -455,15 +448,8 @@ see link:{uri-codegen-kotlin-example}[codegen-kotlin] in the _pkl/pkl-examples_
=== Configuration Options === Configuration Options
=== Configuration Options // TODO: fixme (generateKdoc)
(None)
.generateKdoc: Property<Boolean>
[%collapsible]
====
Default: `false` +
Example: `generateKdoc = true` +
Whether to preserve Pkl doc comments by generating corresponding KDoc comments.
====
Common code generation properties: Common code generation properties:
@@ -534,17 +520,6 @@ Example: `outputDir = layout.projectDirectory.dir("pkl-docs")` +
The directory where generated documentation is placed. The directory where generated documentation is placed.
==== ====
.noSymlinks: Property<Boolean>
[%collapsible]
====
Default: `false` +
Example: `noSymlinks = true` +
Create copies of files and directories instead of symbolic links.
In particular, this affects how the "current" directories containing documentation content for the last generated version should be created.
By default, a symbolic link is created pointing to the last generated version.
If symlinks are disabled, a full copy of the last generated version is created.
====
Common properties: Common properties:
include::../partials/gradle-modules-properties.adoc[] include::../partials/gradle-modules-properties.adoc[]
@@ -651,7 +626,7 @@ Default: `false` +
Whether to ignore expected example files and generate them again. Whether to ignore expected example files and generate them again.
==== ====
Common properties: Common propeties:
include::../partials/gradle-common-properties.adoc[] include::../partials/gradle-common-properties.adoc[]
@@ -713,64 +688,6 @@ Example: `projectDirectories.from(file("pkl-config/""))` +
The project directories to create packages for. The project directories to create packages for.
==== ====
Common properties: Common propeties:
include::../partials/gradle-common-properties.adoc[] include::../partials/gradle-common-properties.adoc[]
[[analyze-imports]]
== Analyze Imports
This feature is the Gradle analogy for the xref:pkl-cli:index.adoc#command-analyze-imports[analyze imports] command in the CLI. It builds a graph of imports of the provided source modules.
=== Usage
[tabs]
====
build.gradle::
+
[source,groovy]
----
pkl {
analyzers {
imports {
appConfig {
sourceModules.add(file("src/main/resources/appConfig.pkl"))
}
}
}
}
----
build.gradle.kts::
+
[source,kotlin]
----
pkl {
analyzers {
imports {
register("appConfig") {
sourceModules.add(file("src/main/resources/appConfig.pkl"))
}
}
}
}
----
====
=== Configuration Options
.outputFormat: Property<String>
[%collapsible]
====
Same meaning as <<output-format,outputFormat>> in <<module-evaluation>>.
====
.outputFile: RegularFileProperty<String>
[%collapsible]
====
Same meaning as <<output-file,outputFile>> in <<module-evaluation>>.
====
Common properties:
include::../partials/gradle-modules-properties.adoc[]
@@ -36,61 +36,4 @@ Example: `generateSpringBootConfig = true` +
Whether to generate config classes for use with Spring Boot. Whether to generate config classes for use with Spring Boot.
==== ====
.implementSerializable: Property<Boolean> // TODO: fixme (implementSerializable)
[%collapsible]
====
Default: `false` +
Example: `implementSerializable = true` +
Whether to generate classes that implement `java.io.Serializable`.
====
.renames: MapProperty<String, String>
[%collapsible]
====
Default: `[:]` +
Example: `renames = ["foo.": "com.example.foo.", "bar.Config": "com.example.bar.Config"]` +
Allows to change default class and package names (derived from Pkl module names) in the generated code.
When you need the generated class or package names to be different from the default names derived from the Pkl module names, you can define a rename mapping, where the key is the original Pkl module name prefix, and the value is its replacement.
When you do, the generated code's `package` declarations, class names, as well as file locations, will be modified according to this mapping.
The prefixes are replaced literally, which means that dots at the end are important.
If you want to rename packages only, in most cases, you must ensure that you have an ending dot on both sides of a mapping (except for an empty mapping, if you use it), otherwise you may get unexpected results:
----
// Assuming the following mapping configuration:
renames = [
"com.foo.": "x", // Dot on the left only
"org.bar": "y.", // Dot on the right only
"net.baz": "z" // No dots
]
// The following renames will be made:
"com.foo.bar" -> "xbar" // Target prefix merged into the suffix
"org.bar.baz" -> "y..baz" // Double dot, invalid name
"net.baz.qux" -> "z.qux" // Looks okay, but...
"net.bazqux" -> "zqux" // ...may cut the name in the middle.
----
When computing the appropriate target name, the longest matching prefix is used:
----
// Assuming the following mapping configuration:
renames = [
"com.foo.Main": "w.Main",
"com.foo.": "x.",
"com.": "y.",
"": "z."
]
// The following renames will be made:
com.foo.Main -> w.Main
com.foo.bar -> x.bar
com.baz.qux -> y.baz.qux
org.foo.bar -> z.org.foo.bar
----
Keys in this mapping can be arbitrary strings, including an empty string.
Values must be valid dot-separated fully qualifed class name prefixes, possibly terminated by a dot.
====
@@ -7,6 +7,7 @@ URI patterns that determine which modules can be loaded and evaluated.
Patterns are matched against the beginning of module URIs. Patterns are matched against the beginning of module URIs.
(File paths have been converted to `file:` URLs at this stage.) (File paths have been converted to `file:` URLs at this stage.)
At least one pattern needs to match for a module to be loadable. At least one pattern needs to match for a module to be loadable.
Both source modules and transitive modules are subject to this check.
==== ====
.allowedResources: ListProperty<String> .allowedResources: ListProperty<String>
@@ -67,18 +68,11 @@ The cache directory for storing packages.
If `null`, defaults to `~/.pkl/cache`. If `null`, defaults to `~/.pkl/cache`.
==== ====
.color: Property<Boolean>
[%collapsible]
====
Default: `false` +
Format messages using ANSI color.
====
.noCache: Property<Boolean> .noCache: Property<Boolean>
[%collapsible] [%collapsible]
==== ====
Default: `false` + Default: `false` +
Disable caching of packages. Disable cacheing of packages.
==== ====
.modulePath: ConfigurableFileCollection .modulePath: ConfigurableFileCollection
@@ -89,21 +83,3 @@ Example: `modulePath.from files("dir1", "zip1.zip", "jar1.jar")` +
The directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs. The directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.
Relative paths are resolved against the project directory. Relative paths are resolved against the project directory.
==== ====
.proxy: Property<URI>
[%collapsible]
====
Default: `null` +
Example: `proxy = uri("http://proxy.example.com:1234")` +
Configures HTTP connections to connect to the provided proxy address.
The URI must have scheme `http`, and may not contain anything other than a host and port.
====
.noProxy: ListProperty<String>
[%collapsible]
====
Default: `null` +
Example: `noProxy = ["example.com", "169.254.0.0/16"]` +
Hosts to which all connections should bypass the proxy.
Hosts can be specified by name, IP address, or IP range using https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].
====
@@ -20,17 +20,11 @@ This property accepts the following types to represent a module:
.transitiveModules: ConfigurableFileCollection .transitiveModules: ConfigurableFileCollection
[%collapsible] [%collapsible]
==== ====
Default: [computed by pkl-gradle] + Default: `files()` (empty collection) +
Example 1: `transitiveModules.from files("module1.pkl", "module2.pkl")` + Example 1: `transitiveModules.from files("module1.pkl", "module2.pkl")` +
Example 2: `+transitiveModules.from fileTree("config").include("**/*.pkl")+` + Example 2: `+transitiveModules.from fileTree("config").include("**/*.pkl")+` +
File paths of modules that are directly or indirectly used by source modules. File paths of modules that are directly or indirectly used by source modules.
Setting this option enables correct Gradle up-to-date checks, which ensures that your Pkl tasks are executed if any of the transitive files are modified; it does not affect evaluation otherwise.
This property, along with `sourceModules`, is the set of input files used to determine whether this task is up-to-date or not.
By default, Pkl computes this property by analyzing the imports of the source modules.
Setting this property explicitly causes Pkl to skip the analyze imports step.
Including source modules in `transitiveModules` is permitted but not required. Including source modules in `transitiveModules` is permitted but not required.
Relative paths are resolved against the project directory. Relative paths are resolved against the project directory.
==== ====
Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

+1 -1
View File
@@ -1,6 +1,6 @@
= Pkl 0.25 Release Notes = Pkl 0.25 Release Notes
:version: 0.25 :version: 0.25
:version-minor: 0.25.1 :version-minor: 0.25.2
:release-date: February 1st, 2024 :release-date: February 1st, 2024
Pkl {version} was released on {release-date}. + Pkl {version} was released on {release-date}. +
-523
View File
@@ -1,523 +0,0 @@
= Pkl 0.26 Release Notes
:version: 0.26
:version-minor: 0.26.3
:release-date: June 17th, 2024
include::ROOT:partial$component-attributes.adoc[]
Pkl {version} was released on {release-date}. +
[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#
This release brings Windows support, improvements to controlling how Pkl talks over HTTP, and also fixes a scoping bug around typealiases.
The next release (0.27) is scheduled for October 10th, 2024.
Please send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +
[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].
To get started, follow xref:pkl-cli:index.adoc#installation[Installation].#
== Highlights [small]#💖#
News you don't want to miss.
[[windows-support]]
=== Windows Support
Pkl is now available on Windows! (https://github.com/apple/pkl/pull/492[#492])
In addition to macOS and Linux, Pkl is now available for download on Windows operating systems.
For installation instructions, consult xref:pkl-cli:index.adoc#windows-executable[Windows Executable] in the CLI reference.
==== Writing cross-platform Pkl programs
On Windows, the in-language filepath separator is still `/`.
This means that most existing Pkl code should still continue working as-is.
A small portion of programs will need to be updated to handle Windows support correctly.
One example is the various conversion scripts that read input files as CLI flags.
For example, here is a snippet from module https://github.com/apple/pkl-pantry/blob/d9571cdce407bb7f1687f81b945a4bfd24ce017d/packages/k8s.contrib/convert.pkl#L100C1-L103C74[k8s.contrib.convert]:
.convert.pkl#L100-L103
[source,pkl]
----
local inputUri =
if (input.startsWith(Regex(#"\w+:"#))) input // absolute URI
else if (input.startsWith("/")) "file://\(input)" // absolute file path
else "file://\(read("env:PWD"))/\(input)" // relative file path
----
On Windows, the env var `PWD` is a Windows-style path, like `C:\Foo\Bar\Baz`.
With the above logic, `inputUri` can expand to a value like `"\file://C:\Foo\Bar\Baz/input.yaml"`.
This would an invalid URI; the correct URI should be `"\file:///C:/Foo/Bar/Baz/input.yaml"`.
Here is a possible fix for this code:
[source,pkl]
----
import "pkl:platform"
local inputUri =
if (input.startsWith(Regex(#"\w+:/"#))) input
else if (input.startsWith("/")) "file://\(input)"
else
let (pwd = read("env:PWD"))
let (
path =
if (platform.current.operatingSystem.name == "Windows")
"/\(pwd)/\(input)".replaceAll("\\", "/")
else "\(pwd)/\(input)"
)
"file://\(path)"
----
To learn more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0006-import-paths-on-windows.adoc[SPICE-0006].
[[http-proxying]]
=== HTTP proxying
Pkl now supports proxying HTTP(S) requests (https://github.com/apple/pkl/pull/506[#506]).
For users of the CLI, Pkl will by default look for proxy settings configured within the OS when on macOS, Windows, and GNOME environments.
This can be changed by adding settings in the following locations:
1. xref:pkl-cli:index.adoc#settings-file[Settings file]
2. xref:language-reference:index.adoc#projects[PklProject file]
3. `--http-proxy` and `--http-no-proxy` CLI flags
As part of this, some changes have been made to the standard library. For details, see <<standard-library-changes,Standard Library changes>>.
Users of the Java/Kotlin bindings can specify proxy settings when building an <<http-java-client,HTTP client>>.
HTTP proxy settings are also added as new fields in the message-passing-api.
Authors of external Pkl clients are encouraged to support these new fields to provide proxy support in their libraries.
For details, see <<message-passing-api-changes,Message passing API changes>>.
To read more about the design of HTTP proxying, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0004-HTTP-Proxy-Support.adoc[SPICE-0004], and also the xref:pkl-cli:index.adoc#http-proxy[documentation].
[[scheme-agnostic-project-dependencies]]
=== Scheme-agnostic project dependencies
Improvements have been made to project dependencies (https://github.com/apple/pkl/pull/486[#486]).
A project dependency is a way to manage `package`-based modules.
It provides two uses:
1. A package can be imported through xref:language-reference:index.adoc#dependency-notation[dependency notation].
2. Conflicting versions in the transitive dependency graph are resolved.
Currently, dependencies can only be used with file-based modules.
This can be limiting in some circumstances:
1. JVM library users typically interact with Pkl by bundling Pkl files a classpath resources, and load them using `modulepath:` URIs.
2. Go library users often embed Pkl code using the https://pkg.go.dev/embed#hdr-Directives[`go:embed` directive], and load them using https://pkg.go.dev/github.com/apple/pkl-go/pkl#WithFs[`WithFs`].
This means that these users miss out on the benefits of project dependencies.
Pkl 0.26 adds support for using dependencies in any hierarchical module scheme.
This means that `modulepath:` users in Java can now declare projects and dependencies.
This also means that other custom methods of embedding modules can also use dependency notation.
[NOTE]
====
A _hierarchical_ URI is a URI whose path part starts with `/`, and in which `/` delimits path segments.
The URI `myscheme:/foo.pkl` is hierarchical, whereas the URI `myscheme:foo.pkl` is not.
====
To read more about this design, consult https://github.com/apple/pkl-evolution/tree/main/spices/SPICE-0005-scheme-agnostic-projects.adoc[SPICE-0005].
[[typealias-scoping-fix-and-change]]
=== Typealias scoping fix and change
Improvements have been made to `typealias`es (https://github.com/apple/pkl/pull/144[#144], https://github.com/apple/pkl/pull/373[#373], https://github.com/apple/pkl/pull/516[#516]).
Currently, a typealias that references a value on its enclosing module will break if used in another module.
.myModule.pkl
[source,pkl]
----
typealias StartsWithFoo = String(startsWith(foo))
foo = "foo"
----
[source,pkl]
----
import "myModule.pkl"
myStr: StartsWithFoo = "fooey"
----
This results in error:
[source]
----
–– Pkl Error ––
Cannot find property `foo`.
1 | typealias StartsWithFoo = String(startsWith(foo))
----
This is a language bug that has been fixed.
In the process of fixing this bug, we realized that the rules around variable resolution within typealiases were problematic.
Typealiases are meant to be statically defined, and shouldn't be able to see properties that can be late-bound.
Thus, a new rule is introduced: a typealias can only reference properties/methods that are `const`.
This is a breaking change. To read more about this breakage and remediation steps, reference <<typealiases-are-treated-as-const>>.
== Noteworthy [small]#🎶#
Ready when you need them.
[[pkldoc-improvements]]
=== Pkldoc improvements
The following improvements have been made to xref:pkl-doc:index.adoc[Pkldoc]:
1. The documentation for the standard library no longer shows dependent packages, because every package implicitly depends on the standard library (https://github.com/apple/pkl/pull/503[#503]).
2. If the standard library exists in the package list, it is shown first (https://github.com/apple/pkl/pull/165[#165]).
3. Fewer characters are percent-encoded. For example, the `(` and `)` characters are no longer percent-encoded (https://github.com/apple/pkl/pull/489[#489]).
[[standard-library-changes]]
=== Standard library changes
To support <<http-proxying,http proxying>>, several changes have been made to the standard library (https://github.com/apple/pkl/pull/506[#506]).
* Module `pkl.settings` has new property `http`.
* class `EvaluatorSettings` originally in `pkl.Project` has been moved to its own module.
For backwards compatibility, `pkl.Project` now has a `typealias EvaluatorSettings` pointing to the new module, but it is marked `@Deprecated`.
=== Java API Changes
[[http-java-client]]
==== HTTP Java Client
A new Java API is introduced, named `org.pkl.core.http.HttpClient` (https://github.com/apple/pkl/pull/217[#217], https://github.com/apple/pkl/pull/295[#295], https://github.com/apple/pkl/pull/506[#506], https://github.com/apple/pkl/pull/518[#518]).
This interface provides the ability to manage how Pkl makes HTTP(S) calls, including how it deals with CA certificates, as well as proxies.
This client can be passed to Pkl's evaluator using `EvaluatorBuilder` for users of pkl-core, and `ConfigEvaluatorBuilder` for users of pkl-config-java or pkl-config-kotlin.
[[http-module-key-factory]]
==== New HTTP ModuleKeyFactory
A new module key factory for HTTP(S) modules has been added (https://github.com/apple/pkl/pull/495[#495]), and can be built with `org.pkl.core.ModuleKeyFactories#http`.
The preconfigured evaluator (`org.pkl.core.EvaluatorBuilder#preconfigured`) includes this module key.
Users that build their own evaluator from scratch should add this module key factory if HTTP(S) modules are needed.
Example:
[source,diff]
----
import org.pkl.core.EvaluatorBuilder;
import org.pkl.core.module.ModuleKeyFactories;
var evaluator = EvaluatorBuilder.unconfigured()
+ .addModuleKeyFactory(ModuleKeyFactories.http) // <1>
.build();
----
<1> Add `ModuleKeyFactories.http` to the set of module key factories used by this evaluator.
If this module key factory is not added, Pkl may still make HTTP(S) requests if `ModuleKeyFactories.genericUrl` is included.
However, this bypasses proxy and CA certificate settings.
[[pkl-executor-changes]]
==== `pkl-executor` changes
A new set of parameters are now available to `org.pkl.executor.Executor` (https://github.com/apple/pkl/pull/217[#217], https://github.com/apple/pkl/pull/518[#518]).
These new parameters are exposed by `org.pkl.executor.spi.v1.ExecutorSpiOptions2`.
The new parameters are:
* `certificateFiles`: A set of CA certificate files to trust when making HTTPS requests.
* `certificateBytes`: A set of PEM-encoded CA certificate bytes to trust when making HTTPS requests.
* `testPort`: An option that is used for internal testing only.
These options are ignored when using a Pkl distribution whose version is lower than 0.26.0.
[[message-passing-api-changes]]
=== Message passing API changes
A new property, `http`, is added to xref:bindings-specification:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request] (https://github.com/apple/pkl/pull/506[#506], https://github.com/apple/pkl/pull/518[#518]).
This allows for the configuration of Pkl's HTTP proxy, as well as CA certificates.
[[rename-codegen-classes]]
=== Ability to rename classes produced by Java/Kotlin code generators
The Java and Kotlin code generators have a new option that allows users to change the name of Java/Kotlin classes that get produced during code generation (https://github.com/apple/pkl/pull/499[#499]).
The CLIs have a new flag, `--rename`, and the Gradle plugin receives a similarly named property called `renames`.
This option accepts a map from an old prefix to a new prefix, where longer prefixes have higher precedence than shorter prefixes.
For example, when generating `module foo.Bar`, specifying `--rename foo.=com.foo.` will cause the Java/Kotlin code generators to emit package `com.foo`, and class `Bar`.
== Breaking Changes [small]#💔#
Things to watch out for when upgrading.
[[typealiases-are-treated-as-const]]
=== Typealiases are treated as `const`
A breaking change has been made to typealiases (https://github.com/apple/pkl/pull/516[#516]).
Typealiases are types that can stand in for another type declaration.
The aliased type can have constraints, where these constraints can reference values defined on the enclosing module.
.baseModule.pkl
[source,pkl]
----
typealias MyValue = Any(isValid) // <1>
isValid = true
----
<1> `isValid` is defined on the enclosing module.
One problem with this is that typealiases are meant to be statically defined.
Like classes, typealiases should not be changed by amending its enclosing module.
[source,pkl]
----
amends "baseModule.pkl"
isValid = false // <1>
----
<1> Despite this amended value, `typealias MyValue` should still stand for `Any(true)`.
To have clearer semantics, a new rule is introduced: referenced members on the enclosing module must be `const`.
Effectively, a typealias is treated as if it is also a `const` member.
To fix the above typealias, the `const` modifier should be added to `isValid`.
[source,diff]
----
typealias MyValue = Any(isValid)
-isValid = true
+const isValid = true
----
It might not always be valid to add the `const` modifier.
For example, this property may be overwritten in a downstream module, so adding the `const` modifier this would break that module.
In these cases, another fix is to self-import the enclosing module.
This works because import declarations introduce values that are implicitly marked `const`.
.baseModule.pkl
[source,diff]
----
+import "baseModule.pkl" // <1>
+
-typealias MyValue = Any(isValid)
+typealias MyValue = Any(baseModule.isValid)
isValid = true
----
<1> Self import
This change aligns with the behavior of class and annotation bodies.
To read more about the rationale behind this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0007-const-checks-in-typealiases.adoc[SPICE-0007].
[[expanded-dependency-notation-uris]]
=== Expanded dependency notation URIs
The parsing of relative path imports has changed (https://github.com/apple/pkl/pull/486[#486]).
Currently, the declaration `import "@foo/bar.pkl"` is treated as the import of a dependency named `foo`, but _only_ when declared within file-based and package-based modules.
In an HTTP-based module, for example, the above import is treated as "bar.pkl inside directory @foo".
To <<scheme-agnostic-project-dependencies,improve project dependencies>>, such declarations are treated as dependency notation in all modules, and will fail with error "Cannot find dependency".
Any import/reads that are intentionally relative-path imports will need to be updated to be prefixed with `./`.
Example:
[source,diff]
----
-import "@bar/foo.pkl"
+import "./@bar/foo.pkl"
----
[[minimum-java-version-bump]]
=== Minimum Java version bumped to Java 17
The minimum Java version for Pkl has been bumped to Java 17 (https://github.com/apple/pkl/pull/439[#439]).
This means that when running the xref:pkl-cli:index.adoc#java-executable[jpkl] CLI, the installed `java` is expected to be Java 17 or higher.
This also means that users of the JVM libraries need to be on at least Java 17 or higher.
[[minimum-gradle-version-bump]]
=== Gradle plugin minimum version bump
The minimum Gradle version for the xref:main:pkl-gradle:index.adoc[Gradle plugin] is now 8.1 (https://github.com/apple/pkl/pull/454[#454]).
[[path-encoding-changes]]
=== Path encoding changes
In order to support Windows, the output of some Pkl tools have unsafe characters encoded in a special format (https://github.com/apple/pkl/pull/489[#489]).
On Windows, the characters `<`, `>`, `:`, `"`, `\`, `|`, `?`, and `*` are reserved and cannot exist in a filename.
Additionally, the ASCII control character code points `0x0` through `0x1f` are also illegal.
These characters are encoded by wrapping their hexadecimal code point value in parentheses.
For example, the character `:` is encoded as `(3a)`.
In some scenarios, files that get written to disk will be encoded.
These are:
* Files generated by Pkldoc.
* `*.kt` files produced by the Kotlin code generator.
* Packages written to the cache directory.
To learn more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0003-windows-safe-paths.adoc[SPICE-0003].
==== Pkldoc links changes
The links generated by Pkldoc have changed.
For example, a module called `module `foo<bar`` creates file `foo(3c)bar.html`, instead of `foo<bar.html`.
As part of this change, some Pkldoc links have also changed.
==== Cache directory prefix changes
The cache directory has been changed from `<moduleCacheDir>/package-1` to `<moduleCacheDir>/package-2`.
If Pkl's dependencies are vendored within a repository, these dependencies will need to be re-vendored.
=== Java API Breaking Changes
The following Java APIs have breaking changes:
|===
|Class/method | Breaking change
|`org.pkl.cli.commands.CliDownloadPackageCommand`
|Renamed to `org.pkl.cli.commands.CliPackageDownloader`
|`org.pkl.cli.commands.CliAbstractProjectCommand`
|Renamed to `org.pkl.cli.commands.CliProjectCommand`
|`org.pkl.config.java.InvalidMappingException`
|Fields `pklName` and `javaName` are now `private`.
|`org.pkl.core.packages.PackageResolver#getInstance`
|New parameter `httpClient` added
|`org.pkl.core.repl.ReplServer.ReplServer`
|New parameter `httpClient` added
|`org.pkl.commons.cli.CliBaseOptions`
|New parameters `testPort`, `httpProxy`, `httpNoProxy` added
|===
[[standard-library-breaking-changes]]
=== Standard library breaking changes
Class `pkl.Project.EvaluatorSettings` has been removed.
A new (deprecated) typealias is added that points to new module `pkl.EvaluatorSettings`.
For both of these, see https://github.com/apple/pkl/pull/506[#506].
[[type-checked-settings-file]]
=== Type-checked settings file
The loading of the xref:pkl-cli:index.adoc#settings-file[settings file] has changed (https://github.com/apple/pkl/pull/477[#477]).
The settings file is a way to control the behavior of the Pkl CLI.
This module is expected to `amends "pkl:settings"`, but this behavior was not checked.
In 0.26, it is an error if the settings module neither amends `"pkl:settings"`, nor set its `output.value` to an instance of the settings module.
[[empty-directories-excluded-from-packaging]]
=== Empty directories excluded from packaging
Currently, the `pkl project package` command will bundle empty directories into the resulting ZIP file.
In version 0.26, this has been changed to exclude these directories (https://github.com/apple/pkl/pull/330[#330]).
This means that the packages can produce a _different_ checksum if there are any empty directories.
This does not break the usage of existing packages, and does not affect compatibility of new packages used with older Pkl 0.25.
However, this can break certain workflows.
The `pkl project package` command runs a publish check, to determine if a package has already been published but with a different checksum.
When upgrading, users might encounter an error message like the following:
[source]
----
-- Pkl Error --
Package `package://example.com/foo@1.0.0` was already published with different contents.
----
To mitigate, the package's version needs to be bumped, even if package contents have not changed.
== Miscellaneous [small]#🐸#
The following changes have been made that are neither new features nor breaking changes.
* Pkl's user-agent header for HTTP requests has been tweaked to add a semicolon (https://github.com/apple/pkl/pull/221[#221]). Here is an example difference:
+
Before: `Pkl/0.26 (macOS native)` +
After: `Pkl/0.26 (macOS; native)`
* Documentation improvements (https://github.com/apple/pkl/pull/120[#120], https://github.com/apple/pkl/pull/121[#121], https://github.com/apple/pkl/pull/142[#142], https://github.com/apple/pkl/pull/121[#121], https://github.com/apple/pkl/pull/337[#337], https://github.com/apple/pkl/pull/341[#341], https://github.com/apple/pkl/pull/372[#372], https://github.com/apple/pkl/pull/386[#386], https://github.com/apple/pkl/pull/391[#391], https://github.com/apple/pkl/pull/397[#397], https://github.com/apple/pkl/pull/422[#422], https://github.com/apple/pkl/pull/436[#436], https://github.com/apple/pkl/pull/469[#469], https://github.com/apple/pkl/pull/484[#484], https://github.com/apple/pkl/pull/485[#485], https://github.com/apple/pkl/pull/[#491]).
* Optimization: `const` access is checked when variables are resolved, instead of every time the variable is accessed (https://github.com/apple/pkl/pull/438[#438]).
* Optimization: use logical AND instead of bitwise AND when comparing numbers (https://github.com/apple/pkl/pull/102[#102]).
* Mark Java classes `final` (https://github.com/apple/pkl/pull/458[#458]).
* Migrate code to newer JDK17 features, and clean up existing Java code (https://github.com/apple/pkl/pull/451[#451], https://github.com/apple/pkl/pull/458[#458], https://github.com/apple/pkl/pull/512[#512]).
* Improve rendering of string values within generated `<file>.pkl-expected.pcf` files when running `pkl test` (https://github.com/apple/pkl/pull/416[#416]).
* Improve performance of loading Pkl's built-in CA certificates (https://github.com/apple/pkl/pull/518[#518]).
== Bug Fixes [small]#🐜#
The following bugs have been fixed.
* `Collection#sortWith` produces un-sorted output (https://github.com/apple/pkl/pull/394[#394]).
* Property `typedType` in module `pkl.reflect` reflects upon `Type`, instead of `Typed` (https://github.com/apple/pkl/pull/426[#426]).
* `const` members can be assigned to when via an object spread (https://github.com/apple/pkl/pull/428[#428]).
* Relative globbed reads resolve to the same value in different modules (https://github.com/apple/pkl/pull/449[#449]).
* Performance bug: globbed imports and globbed reads expand to an unbounded number of root nodes (https://github.com/apple/pkl/pull/449[#449]).
* Relative globbed imports within a package match no modules (https://github.com/apple/pkl/pull/496[#496]).
* Constraints within typealiases resolve to the wrong values (https://github.com/apple/pkl/pull/144[#144]).
* Members of `pkl.reflect` cannot be rendered (https://github.com/apple/pkl/pull/170[#170], https://github.com/apple/pkl/pull/470[#470]).
* Throws `NullPointerException` if "List Resources Response" or "List Modules Response" messages contain both null `pathElements` and `error` (https://github.com/apple/pkl/pull/480[#480]).
* Classes of `com.oracle.truffle` are not shaded in pkl-config-java-all and pkl-tools (https://github.com/apple/pkl/pull/238[#238]).
* Throws `PklBugException` when running publish check on an invalid URL (https://github.com/apple/pkl/pull/441[#441]).
== Contributors [small]#🙏#
We would like to thank the contributors to this release (in alphabetical order):
* https://github.com/flyinprogrammer[@flyinprogrammer]
* https://github.com/fumiya-kume[@fumiya-kume]
* https://github.com/garysassano[@garysassano]
* https://github.com/HT154[@HT154]
* https://github.com/hoxell[@hoxell]
* https://github.com/jw-y[@jw-y]
* https://github.com/KushalP[@KushalP]
* https://github.com/lilyball[@lilyball]
* https://github.com/luuvish[@luuvish]
* https://github.com/Malix-off[@Malix-off]
* https://github.com/manuelsblanco[@manuelsblanco]
* https://github.com/MarkSRobinson[@MarkSRobinson]
* https://github.com/mitchcapper[@mitchcapper]
* https://github.com/mrs1669[@mrs1669]
* https://github.com/netvl[@netvl]
* https://github.com/nirinchev[@nirinchev]
* https://github.com/raj-j-shah[@raj-j-shah]
* https://github.com/sgammon[@sgammon]
* https://github.com/StefMa[@StefMa]
* https://github.com/stefanobaghino[@stefanobaghino]
* https://github.com/TimeTravelPenguin[@TimeTravelPenguin]
* https://github.com/TheFruxz[@TheFruxz]
* https://github.com/translatenix[@translatenix]
* https://github.com/zihluwang[@zihluwang]
A special thank-you goes out to https://github.com/translatenix[@translatenix]!
They submitted multiple bug fixes, improved the quality of the codebase, and provided HTTP improvements.
-542
View File
@@ -1,542 +0,0 @@
= Pkl 0.27 Release Notes
:version: 0.27
:version-minor: 0.27.2
:release-date: November 5th, 2024
include::ROOT:partial$component-attributes.adoc[]
Pkl {version} was released on {release-date}. +
[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#
This release brings improvements in typechecking of `Listing` and `Mapping`, the ability to use readers from external processes, as well as a new import graph analyzer API.
The next release (0.28) is scheduled for February 2025.
Please send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +
[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].
To get started, follow xref:pkl-cli:index.adoc#installation[Installation].#
== Highlights [small]#💖#
News you don't want to miss.
[#typecheck-improvements]
=== Improved typechecking of `Listing` and `Mapping` types
Typechecking of `Listing` and `Mapping` types has been improved (https://github.com/apple/pkl/pull/628[#628], https://github.com/apple/pkl/pull/725[#725], https://github.com/apple/pkl/pull/740[#740], https://github.com/apple/pkl/pull/752[#752], https://github.com/apple/pkl/pull/778[#778], https://github.com/apple/pkl/pull/781[#781]).
Today, the typecheck `listing: Listing<E>` immediately evaluates all listing elements to check that they have type `E`.
Likewise, the typecheck `mapping: Mapping<K, V>` immediately evaluates all mapping values to check that they have type `V`.
For example, the typecheck `listing: Listing<Bird>` proceeds as follows:
1. Check that `listing` has type `Listing`
2. Evaluate each listing element and check that it has type `Bird`
This behavior is different from how the rest of Pkl works.
Generally, Pkl only evaluates code that affects program output.
For example, consider the following program:
[source,pkl]
----
class Bird {
name: String
canFly: Boolean
}
local bird: Bird = new {
name = "Pidgy"
canFly = throw("uh oh")
}
birdName = bird.name
----
Even though `bird.canFly` throws an error, the above program succeeds because `bird.canFly` is not part of the program's output and hence is never accessed (Note that `bird` is a _local_ property).
Typechecks of `Mapping` and `Listing` types have been changed to match this behavior.
Mapping and listing values are now only typechecked if and when they are accessed.
NOTE: Mapping _keys_ are still eagerly checked.
This change causes some previously failing programs to evaluate successfully:
[source,pkl]
----
local myNumbers: Listing<Int> = new { 1; 2; "uh oh" }
result = myNumbers[0]
----
In Pkl 0.26 and below, the above program fails with a type mismatch error because element `"uh oh"` is typechecked when `myNumbers` is accessed.
In Pkl 0.27, the same program succeeds, because only element `myNumbers[0]` is part of the program's output and its typecheck succeeds.
As another consequence of this change, some Pkl programs now complete more quickly:
[source,pkl]
----
local allBirds: Mapping<String, Bird> = import*("**/bird.pkl")
environment: "prod"|"qa"
cluster: String
myBird = allBirds["\(environment)/\(cluster)/bird.pkl"] // <1>
----
In Pkl 0.26 and below, all modules matching `**/bird.pkl` are imported when `allBirds` is accessed and typechecked.
This can take a long time.
In Pkl 0.27, only module `"\(environment)/\(cluster)/bird.pkl"` is imported because only this module is part of the program's output.
To learn more about this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0010-overhauled-mapping-listing-typechecks.adoc[SPICE-0010].
=== External readers
A new feature has been added to allow Pkl to spawn external processes to read resources and modules (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/762[#762], https://github.com/apple/pkl/pull/766[#766], https://github.com/apple/pkl/pull/770[#770]).
Today, users who use Pkl as a library can define custom module and resource readers.
This allows authors to extend how Pkl performs I/O.
For example, users can implement a reader that reads the `secret:` scheme, where they define exactly how the bytes are fetched in the host runtime.
[source,pkl]
----
result = read("secret:mypassword") // <1>
----
<1> `secret:` is a custom scheme defined by the host runtime.
However, CLI users have been left out.
In Pkl 0.27, a new extension point is added to allow users to implement module and resource readers as external processes.
When run, Pkl will spawn the external process, and talk to the process via xref:bindings-specification:message-passing-api.adoc[message passing].
To learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0009-external-readers.adoc[SPICE-0009].
Thanks to https://github.com/HT154[@HT154] for contributing the feature!
[[import-analysis]]
=== Import analysis API
A new API has been added to analyze the import graph of Pkl modules (https://github.com/apple/pkl/pull/695[#695]).
This API comes in four forms:
1. A standard library module: `pkl:analyze`
2. A CLI command: `pkl analyze imports`
3. A Java API: `org.pkl.core.Analyzer`
4. A Gradle API: `org.pkl.gradle.task.AnalyzeImportsTask`
Some use-cases for this API are:
* For build tools to perform out-of-date checks. Build tools can invalidate a cached result if any of the transitive modules have changed.
* Static code analysis, to determine how Pkl modules depend on each other.
With this API, xref:pkl-gradle:index.adoc[] now by default <<transitive-modules-computed-by-default,computes the transitive modules>> for many of its tasks.
Here is an example of the CLI in use:
[source,shell]
----
pkl analyze imports -f json myModule.pkl # <1>
----
<1> `-f` means: produce output in JSON.
Produces:
[source,json]
----
{
"imports": {
"file:///my/proj/myModule.pkl": [
{
"uri": "projectpackage://example.com/birds@1.0.0#/Bird.pkl"
}
],
"projectpackage://example.com/birds@1.0.0#/Bird.pkl": []
},
"resolvedImports": {
"file:///my/proj/myModule.pkl": "file:///my/proj/myModule.pkl",
"projectpackage://example.com/birds@1.0.0#/Bird.pkl": "file:///my/birds/Bird.pkl"
}
}
----
From this output, we can see that `myModule.pkl` imports `Bird.pkl` from the `birds` package.
We can also see that the module `projectpackage://example.com/birds@1.0.0#/Bird.pkl` resolves to disk location `\file:///my/birds/Bird.pkl` (we can deduce that `birds` is a xref:language-reference:index.adoc#local-dependencies[local dependency]).
To learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0001-import-graph-analyzer-api.adoc[SPICE-0001].
== Noteworthy [small]#🎶#
Ready when you need them.
=== Colored output
The Pkl CLI will now emit some messages in color (https://github.com/apple/pkl/pull/552[#552], https://github.com/apple/pkl/pull/746[#746], https://github.com/apple/pkl/pull/771[#771], https://github.com/apple/pkl/pull/779[#779]).
Here is a sneak peek of colored error messages in action.
image::error_sample.png[syntax highlighted output]
Thanks to https://github.com/thomaspurchas[@thomaspurchas] for contributing to this feature!
=== `const local` object members
The `const` modifier can be applied to object members, provided that they are also `local` (https://github.com/apple/pkl/pull/678[#678]).
Currently, regular object members are not allowed to have the `const` modifier.
This introduces an artificial pain point.
For example, given the following module:
[source,pkl]
----
amends "Bird.pkl"
import "Bird.pkl"
local northAmerica = "North America"
local typealias NorthAmericanBird = Bird(this.origin == northAmerica) // <1>
----
<1> Error: cannot reference `northAmerica` from here because it is not `const`.
This is invalid code, because this typealias is referencing a non-const value on the enclosing module.
However, is not possible fix this by adding the `const` modifier to `northAmerica`.
This is because this module `amends "Bird.pkl"`, which means that this module is considered a regular object and not a class.
This means that any members declared here are _object members_, and not _class members_.
In Pkl 0.27, a new rule is introduced to allow the `const` modifier to be applied to object members, provided that they are also `local`.
This change affects object properties, as well as object methods.
To read more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0011-const-object-members.adoc[SPICE-0011].
=== Pkl CLI changes
==== New CLI Flags
Some new common flags have been added to the CLI (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/746[#746]).
|===
|Flag |Description
|`--color`
|Format messages with ANSI color codes
|`--external-module-reader`
|Shell out to a process to read certain modules.
|`--external-resource-reader`
|Shell out to a process to read certain resources.
|===
==== New command: `pkl analyze imports`
As part of the set of APIs added for <<import-analysis,import analysis>>, a new subcommand has been added called `analyze imports` (https://github.com/apple/pkl/pull/695[#695]).
For details, consult the xref:pkl-cli:index.adoc#command-analyze-imports[CLI documentation].
=== Kotlin/Java code generator improvements
Various improvements have been made to the Kotlin and Java code generators (https://github.com/apple/pkl/pull/705[#705], https://github.com/apple/pkl/pull/710[#710], https://github.com/apple/pkl/pull/714[#714], https://github.com/apple/pkl/pull/721[#721], https://github.com/apple/pkl/pull/729[#729]).
==== Java codegen improvements
* Only generate `hashCode()`, `equals()`, and `toString()` methods for Java classes that are instantiable.
* Add support for Spring Boot 3.
* Make module classes also implement serializable.
* Make empty Java classes instantiable.
==== Kotlin codegen improvements
* Skip generation of `copy()`, `equals()`, `hashCode()`, `toString()` methods for abstract Kotlin classes.
* Don't implement `Serializable` for abstract classes
* Add support for Spring Boot 3.
Thanks to https://github.com/translatenix[@translatenix] for contributing these improvements!
=== Gradle Plugin changes
==== New `AnalyzeImportsTask`
A new task called `org.pkl.gradle.task.AnalyzeImportsTask` is introduced (https://github.com/apple/pkl/pull/695[#695]).
This task is the Gradle analogy to `pkl analyze imports`.
Example:
[tabs]
====
build.gradle::
+
[source,groovy]
----
pkl {
analyzers {
imports {
appConfig {
sourceModules.add(file("src/main/resources/appConfig.pkl"))
}
}
}
}
----
build.gradle.kts::
+
[source,kotlin]
----
pkl {
analyzers {
imports {
register("appConfig") {
sourceModules.add(file("src/main/resources/appConfig.pkl"))
}
}
}
}
----
====
For more details, consult the xref:pkl-gradle:index.adoc#analyze-imports[documentation].
==== Tracked file outputs
Tasks created by the Pkl plugin now declare tracked output files (https://github.com/apple/pkl/pull/403[#403]).
This means that downstream tasks do not need to declare an explicit dependency on the Pkl task.
For example, assuming that `evalPkl` is an `EvalTask`:
.build.gradle.kts
[source,diff]
----
val myGradleTask by tasks.registering {
inputs.files(evalPkl)
- dependsOn(evalPkl) // <1>
}
----
<1> No longer necessary to declare this dependency.
[[transitive-modules-computed-by-default]]
==== `transitiveModules` computed by default
The `transitiveModules` property of a task is now computed by building the import graph of the source modules (https://github.com/apple/pkl/pull/695[#695]).
This means that Pkl-related tasks no longer need to declare their set of transitive modules, because the pkl-gradle plugin will compute this automatically.
NOTE: This adds latency to each task. To opt out of this behavior, set `transitiveModules` explicitly.
=== Standard library changes
==== Additions to `pkl:base`
New properties and methods have been added to the classes of `pkl:base` (https://github.com/apple/pkl/pull/666[#666], https://github.com/apple/pkl/pull/683[#683]).
New properties and methods have been added to {uri-stdlib-Listing}[`Listing`] and {uri-stdlib-Mapping}[`Mapping`].
One of the goals of this change is to improve the experience of authoring constraints.
This eliminates the need to convert to collection types as often.
The added properties and methods are:
* {uri-stdlib-Listing}#first[`Listing.first`]
* {uri-stdlib-Listing}#firstOrNull[`Listing.firstOrNull`]
* {uri-stdlib-Listing}#last[`Listing.last`]
* {uri-stdlib-Listing}#lastOrNull[`Listing.lastOrNull`]
* {uri-stdlib-Listing}#single[`Listing.single`]
* {uri-stdlib-Listing}#singleOrNull[`Listing.singleOrNull`]
* {uri-stdlib-Listing}#every()[`Listing.every()`]
* {uri-stdlib-Listing}#any()[`Listing.any()`]
* {uri-stdlib-Listing}#contains()[`Listing.contains()`]
* {uri-stdlib-Mapping}#containsValue()[`Mapping.containsValue()`]
* {uri-stdlib-Mapping}#every()[`Mapping.every()`]
* {uri-stdlib-Mapping}#any()[`Mapping.any()`]
With this, the following change can be made to existing constraints:
[source,diff]
----
-ipAddresses: Listing<String>(toList().contains("127.0.0.1"))
+ipAddresses: Listing<String>(contains("127.0.0.1"))
----
Additionally, a new method is added to `String`, called {uri-stdlib-String}#splitLimit()[`String.splitLimit()`].
==== Additions to `pkl:EvaluatorSettings`
New properties have been added to `pkl:EvaluatorSettings` (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/746[#746]).
These are:
* {uri-stdlib-evaluatorSettingsModule}/#color[`color`]
* {uri-stdlib-evaluatorSettingsModule}/#externalModuleReaders[`externalModuleReaders`]
* {uri-stdlib-evaluatorSettingsModule}/#externalResourceReaders[`externalResourceReaders`]
==== `String` to `Number` conversion improvements.
The `String` to `Number` converter methods, for example, {uri-stdlib-StringToInt}[`String.toInt()`], can now handle underscore separators (https://github.com/apple/pkl/pull/578[#578], https://github.com/apple/pkl/pull/580[#580]).
This better aligns with the source code representation of xref:language-reference:index.adoc#integers[number literals].
[source,pkl]
----
myNum = "1_000".toInt() // <1>
----
<1> Result: `1000`
==== New module: `pkl:analyze`
As part of <<import-analysis>>, a new standard library module is added called `pkl:analyze` (https://github.com/apple/pkl/pull/695[#695]).
This module provides an API for computing the total import graph given a set of input modules.
This API treats the inputs as entrypoints, and produces a graph representing the entire dependency tree, including transitive imports.
Example:
[source,pkl]
----
import "pkl:analyze"
importGraph: analyze.ImportGraph = analyze.importGraph(Set("file:///path/to/my/module.pkl"))
----
For details, see the {uri-stdlib-analyzeModule}[documentation].
=== Annotations on `PklProject` added to packages
When creating packages, some annotations on a `PklProject` will affect how pkldoc generates documentation.
* `@Unlisted`: Omit the package from publishing documentation.
* `@Deprecated`: Add information on the package to show that it is deprecated.
Example:
.PklProject
[source,pkl]
----
@Deprecated
amends "pkl:Project"
----
=== Test report improvements
The report generated from `pkl test` has been overhauled and improved (https://github.com/apple/pkl/pull/498[#498], https://github.com/apple/pkl/pull/628[#682], https://github.com/apple/pkl/pull/738[#738], https://github.com/apple/pkl/pull/771[#771]).
* Tests are grouped into either the `facts` or `examples` section.
* A summary line is added, describing how many tests have passed and failed, and how many assertions have passed and failed.
* Test results are colored.
* The ✅ and ❌ emojis are replaced with ✔ and ✘.
* Thrown errors are reported within the test.
Here is a sneak peek of the new test result output.
image::test_sample.png[]
Thanks to https://github.com/jjmaestro[@jjmaestro] for contributing to this improvement!
=== Java API additions
==== New API: `org.pkl.core.Analyzer`
As part of <<import-analysis>>, a new Java API called `org.pkl.core.Analyzer` is introduced (https://github.com/apple/pkl/pull/695[#695]).
==== New methods
The following methods are added:
**pkl-executor**
* `org.pkl.executor.ExecutorException.getPklVersion`
* `org.pkl.executor.ExecutorException.ExecutorException(java.lang.String, java.lang.Throwable, java.lang.String)`
**pkl-core**
* `org.pkl.core.module.ModuleKeyFactories.externalProcess(java.lang.String, org.pkl.core.externalreader.ExternalReaderProcess)`
* `org.pkl.core.module.ModuleKeyFactories.externalProcess(java.lang.String, org.pkl.core.externalreader.ExternalReaderProcess, long)`
== Breaking Changes [small]#💔#
Things to watch out for when upgrading.
=== Java API breaking changes
The following Java APIs have breaking changes:
|===
|Class/method | Breaking change
|`org.pkl.core.runtime.TestResults`
|Moved to `org.pkl.core.TestResults`, turned into a record, and largely restructured.
|`org.pkl.core.module.ModuleKeyFactories.closeQuietly`
|Deprecated for removal in favor of `org.pkl.core.Closeables.closeQuietly`.
|===
=== Spring Boot 2 support dropped
The Java code generator no longer supports Spring Boot 2.x (https://github.com/apple/pkl/pull/729[#729]).
Spring Boot 2 users can continue to use the Pkl 0.26 code generator.
=== `pkl test` considered failing when writing examples
If running `pkl test` results in `pkl-expected.pcf` files being written, the test now exits with exit code `10` (https://github.com/apple/pkl/pull/738[#738]).
Additionally, the junit reports will consider the test as failing.
=== `Listing` and `Mapping` typecheck changes
Due to changes to <<typecheck-improvements,Listing and Mapping typechecking>>, some previously failing programs now succeed.
This can happen when erroneous code is never evaluated because it does not affect program output:
[source,pkl]
----
local myNumbers: Listing<Int> = new { 1; 2; "uh oh" }
result = myNumbers[0] // <1>
----
<1> In Pkl 0.26 and below, throws a type mismatch error.
+
In Pkl 0.27, yields `1`.
== Miscellaneous [small]#🐸#
* Make pkl-doc top box include a preview of the rest of module-level documentation (https://github.com/apple/pkl/pull/570[#570]).
* Module `pkl-core` now has a dependency on `org.msgpack:msgpack-core` (https://github.com/apple/pkl/pull/660[#660]). Users concerned about potential version conflicts can use one of Pkl's shaded fat JARs (`pkl-config-java-all`, `pkl-tools`).
* Make PklProject.deps.json files end in a newline (https://github.com/apple/pkl/pull/664[#644]).
* Fix invalid syntax of code examples in stdlib doc comments (https://github.com/apple/pkl/pull/703[#703]).
* Update Java dependencies (https://github.com/apple/pkl/pull/689[#689], https://github.com/apple/pkl/pull/767[#767]).
* Add jbang catalog support (https://github.com/apple/pkl/pull/655[#655]).
* Documentation improvements (https://github.com/apple/pkl/pull/623[#623], https://github.com/apple/pkl/pull/680[#680], https://github.com/apple/pkl/pull/682[#682], https://github.com/apple/pkl/pull/685[#685], https://github.com/apple/pkl/pull/687[#687], https://github.com/apple/pkl/pull/703[#703], https://github.com/apple/pkl/pull/704[#704], https://github.com/apple/pkl/pull/715[#715], https://github.com/apple/pkl/pull/730[#730], https://github.com/apple/pkl/pull/753[#753]).
== Bug Fixes [small]#🐜#
The following bugs have been fixed.
* CLI `--property` flags containing `=` in property values are not parsed correctly (https://github.com/apple/pkl/issues/630[#630]).
* Thrown `PklBugException` when reading assets from a local project dependency (https://github.com/apple/pkl/issues/641[#641]).
* Thrown `PklBugException` when PklProjects have a cyclical local dependency (https://github.com/apple/pkl/pull/731[#731]).
* Thrown exception when sending `ReadResourceResponse` or `ReadModuleResponse` where both `contents` and `error` are `null` (https://github.com/apple/pkl/pull/657[#657]).
* Double unary minus is evaluated as single unary minus (https://github.com/apple/pkl/pull/697[#697]).
* Kotlin compiler fails to compiler generated classes with "copy overrides nothing" for subclasses of abstract classes (https://github.com/apple/pkl/issues/569[#569]).
* "Unexpected error" thrown when `Module.output` has its type overridden (https://github.com/apple/pkl/issues/709[#709]).
* "Unexpected error" thrown when loading files with non-ASCII characters (https://github.com/apple/pkl/issues/653[#653]).
* Type parameters in `new Mapping<TypeA, TypeB>`/`new Listing <Type>` are not checked (https://github.com/apple/pkl/issues/405[#405]).
* Comparison methods of `pkl:semver` are incorrect (https://github.com/apple/pkl/issues/772[#772]).
== Contributors [small]#🙏#
We would like to thank the contributors to this release (in alphabetical order):
* https://github.com/djarnis73[@djarnis73]
* https://github.com/kasugamirai[@kasugamirai]
* https://github.com/KushalP[@KushalP]
* https://github.com/jjmaestro[@jjmaestro]
* https://github.com/HT154[@HT154]
* https://github.com/lamtrinhdev[@lamtrinhdev]
* https://github.com/ManuW[@ManuW]
* https://github.com/maxandersen[@maxandersen]
* https://github.com/netvl[@netvl]
* https://github.com/StefMa[@StefMa]
* https://github.com/taichi-ishitani[@taichi-ishitani]
* https://github.com/thomaspurchas[@thomaspurchas]
* https://github.com/translatenix[@translatenix]
-378
View File
@@ -1,378 +0,0 @@
= Pkl 0.28 Release Notes
:version: 0.28
:version-minor: 0.28.2
:release-date: February 26th, 2025
include::ROOT:partial$component-attributes.adoc[]
:uri-snippet-tests: {uri-github-tree}/pkl-core/src/test/files/LanguageSnippetTests/input
:uri-standard-library: {uri-github-tree}/stdlib/
:uri-antlr: https://www.antlr.org
:wbr: pass:[<wbr />]
Pkl {version} was released on {release-date}. +
[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#
The next release (0.29) is scheduled for June 2025.
To see what's coming in the future, follow the {uri-pkl-roadmap}[Pkl Roadmap].
Please send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +
[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].
To get started, follow xref:pkl-cli:index.adoc#installation[Installation].#
== Highlights [small]#💖#
News you don't want to miss.
=== New parser
Pkl has new parser (https://github.com/apple/pkl/pull/917[#917], https://github.com/apple/pkl/pull/957[#957], https://github.com/apple/pkl/pull/962[#962])!
The first step to evaluating a program is to parse its source code into a parse tree.
Currently, Pkl uses link:{uri-antlr}[ANTLR] to generate parser code from grammar files.
Using this approach has allowed for rapidly iterating and changing the language's grammar.
However, Pkl's grammar has matured; it's not as likely that the grammar will change from one version to the next.
Additionally, the current parser's performance has become more painful as projects written in Pkl grow in size.
In many cases, parsing can take up most of the time spent during evaluation.
In 0.28, the ANTLR-generated parser is being replaced by a handwritten parser.
In benchmarking tests, this has shown to improve parsing speed by around two orders of magnitude.
Here are some quick comparisons between the two parsers, run on a MacBook Pro M4 Max machine, with 5 warmup iterations, and run for 10 iterations:
|===
||Old parser |New parser
|link:{uri-snippet-tests}[Language snippet tests]
|440.8ms
|5.9ms
|link:{uri-standard-library}[Standard library]
|136.7msfootnote:[In the `pkl` CLI, the standard library is parsed during compilation rather than during evaluation. As a result, there is no parsing overhead.]
|0.8ms
|All https://github.com/apple/pkl-pantry[pkl-pantry] modules
|1424.2ms
|7.0ms
|===
== Noteworthy [small]#🎶#
Ready when you need them.
=== CLI improvements
==== Colored help messages
The `pkl`, `pkldoc`, `pkl-codegen-java`, and `pkl-codegen-kotlin` CLIs now emits help text with colors (https://github.com/apple/pkl/pull/947[#947]).
Here is a sneak peek:
image::pkl-cli-help-new.png[new pkl cli help output]
Thanks to https://github.com/gordonbondon[@gordonbondon] for their contribution!
==== `jpkl` support on Windows
The `jpkl` executable is now supported on Windows (https://github.com/apple/pkl/pull/872[#872]).
`jpkl` is a fat jar that can be executed directly when on macOS and Linux, but current users of Windows are required to execute it with `java -jar <path/to/jpkl>`.
In 0.28, Windows users can also call execute this command directly.
To do so, the filename should be called `jpkl.bat`, and placed in `PATH`.
=== Type constraint changes
Type annotations that are executed as a result of calling a constraint expressions now perform an eager typecheck (https://github.com/apple/pkl/pull/964[#964]).
In Pkl 0.27, we changed how xref:0.27.adoc#typecheck-improvements[typechecks are executed for `Listing` and `Mapping`] types.
However, this had two unintended side effects:
For one, error messages from certain failing constraints show `?` in place of values that are failing.
The following snippet:
[source%parsed,pkl]
----
class Bird { name: String }
bird: Listing<Bird>(firstOneIsQuail) = new {
new { name = "Pigeon" }
new { name = "Quail" }
}
local firstOneIsQuail = (it: Listing<Bird>) -> it[0].name == "Quail"
----
Produces the following error message:
[source]
----
–– Pkl Error ––
Type constraint `firstOneIsQuail` violated.
Value: new Listing { ?; ? }
3 | bird: Listing<Bird>(firstOneIsQuail) = new {
^^^^^^^^^^^^^^^
----
:fn-typecheck-details: footnote:[See https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0010-overhauled-mapping-listing-typechecks.adoc#delegating-objects[delegating objects] in SPICE-0010 for more details on this behavior.]
This is happening because lazy typechecks of mappings and listings will return a _new_ listing. Because the lambda's argument is defined as ``it: Listing<Bird>``, the value being passed into the function body is this new listing{fn-typecheck-details}.
Secondly, some constraints became less strict, allowing more values to pass.
The following snippet fails in Pkl 0.26, but passes in Pkl 0.27:
[source%parsed,pkl]
----
class Bird { name: String }
local nonEmpty = (it: Listing<Bird>) -> !it.isEmpty
birds: Listing(nonEmpty) = new { 1; 2; 3 }
----
This is because the function parameter `it: Listing<Bird>` does not actually check members of the argument until they are accessed, and the function body `!it.isEmpty` does not access any members.
To address both of these issues, the rule for executing type constraints has changed.
When executing a type annotation, mapping and listing typechecks are always _eager_.
This means that Pkl will check that each member of the mapping/listing conforms to the type parameter.
=== Java 22+ support
Pkl's Java libraries now support Java 22 and higher (https://github.com/apple/pkl/pull/876[#876]).
Thanks to https://github.com/sgammon[@sgammon] for their contribution!
=== New standard library method
The `pkl:math` standard library module has a new method, called {uri-stdlib-mathModule}/index.html#atan2()[atan2] (https://github.com/apple/pkl/pull/819[#819]).
It computes the https://en.wikipedia.org/wiki/Atan2[2-argument arctangent].
Thanks to https://github.com/gordonbondon[@gordonbondon] for their contribution!
=== Overhauled for-generator implementation
The implementation of xref:language-reference:index.adoc#for-generators[for-generators] has been overhauled (https://github.com/apple/pkl/pull/844[#844]).
This fixes some known bugs with the current for-generator implementation, and also improves code health by reducing complexity and removing workarounds and band-aids.
Thanks to https://github.com/odenix[@odenix] for their contribution!
=== Java code generator improvements
Improvements have been made to the Java code generator (https://github.com/apple/pkl/pull/792[#792]).
In pkl-codegen-java, the `--params-annotation` flag now accepts `none` as a value, which causes the code generator to skip adding annotations to a constructor's parameters.
Additionally, the Kotlin API `org.pkl.codegen.java.JavaCodeGeneratorOptions.paramsAnnotation` is now nullable.
If null, this also skips adding annotations.
By default, this annotation is set to `org.pkl.config.java.mapper.Named`, or none if the `--generate-spring-boot-config` flag is set.
This is useful for those compiling Java code with the `-parameters` flag set, because the pkl-config-java library is able to map into these classes without any extra annotations.
Thanks to https://github.com/odenix[@odenix] for their contribution!
=== Kotlin code generator improvements
Improvements have been made to the Kotlin code generator (https://github.com/apple/pkl/pull/793[#793]).
Currently, the output of `toString()` on a generated Kotlin class differs depending on if it was generated as a data class or as a regular class.
In Pkl 0.28, this method produces the same format, and matches the format used by data classes.
Thanks to https://github.com/odenix[@odenix] for their contribution!
=== pkldoc improvements
pkldoc has a new flag to write real files instead of symlinks (https://github.com/apple/pkl/pull/824[#824]).
Currently, pkldoc creates a symlink called "current", which points to the latest non-prerelease version of a package.
However, these symlinks can be problematic for some systems.
A new flag, `--no-symlinks`, and a similarly named Gradle property, `noSymlinks`, instructs pkldoc to write real files instead of symlinks.
Thanks to https://github.com/netvl[@netvl] for their contributions!
=== `jar:nested:` URIs are accepted by default
To improve integration with Spring Boot, the Pkl evaluator by default now accepts module URIs starting with `jar:nested:` (https://github.com/apple/pkl/pull/895[#895]).
The `--allowed-modules` flag (and the equally named option in other APIs) can be used to configure the set of allowed modules.
== Breaking Changes [small]#💔#
Things to watch out for when upgrading.
=== Stricter grammar
As a result of implementing a new parser, the following previously accepted grammar is no longer valid (https://github.com/apple/pkl/pull/917[#917]).
==== Inline object entries
When declaring multiple xref:language-tutorial:01_basic_config.adoc#entries[entries] on the same line, a semicolon is now required to separate them.
The following code snippet is currently valid, and becomes a syntax error in 0.28.
[source,pkl]
----
obj { ["one"] = 1 ["two"] = 2 }
----
To fix, insert a semicolon between the two entries:
[source,diff]
----
-obj { ["one"] = 1 ["two"] = 2 }
+obj { ["one"] = 1; ["two"] = 2 }
----
==== String escapes
When using xref:language-reference:index.adoc#custom-string-delimiters[custom string delimiters], the escape sequence becomes backslash (`\`) plus the number of pounds used to delimit the string.
Due to a parser bug, any extra pounds after this escape sequence are also permitted.
In Pkl 0.28, this becomes a syntax error.
[source,pkl]
----
foo = "foo \#(bar)" // Invalid character escape sequence `\#`.
----
==== Whitespace between generator members
Inline object spreads, for generators, and when generators all now require either whitespace or a semicolon separator.
[source,pkl]
----
foo { ...bar...baz } // Syntax error
----
=== Minimum Gradle version bump
The minimum Gradle version for the xref:main:pkl-gradle:index.adoc[Gradle Plugin] has been bumped to 8.2 (https://github.com/apple/pkl/pull/901[#901]).
=== Minimum Kotlin version bump
For users of Pkl's Kotlin libraries, the minimum Kotlin version has been bumped to 2.0 (https://github.com/apple/pkl/pull/900[#900]).
=== Java/Kotlin API breaking changes
Breaking changes have been made to the Java/Kotlin APIs (https://github.com/apple/pkl/pull/748[#748], https://github.com/apple/pkl/pull/749[#749], https://github.com/apple/pkl/pull/776[#776], https://github.com/apple/pkl/pull/793[#793], https://github.com/apple/pkl/pull/808[#808], https://github.com/apple/pkl/pull/810[#810]).
|===
|API |Breakage
| org.pkl.core.resource{wbr}.Resource
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.project{wbr}.Package
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.Member{wbr}.SourceLocation
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core{wbr}.Release
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.Release{wbr}.SourceCode
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.Release{wbr}.Documentation
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.Release{wbr}.StandardLibrary
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.project{wbr}.DeclaredDependencies
| Converted into a record; previous getter methods are deprecated.
| org.pkl.core.evaluatorSettings{wbr}.PklEvaluatorSettings{wbr}.Proxy{wbr}.create
| Deprecated; use the constructor instead.
| org.pkl.core.module{wbr}.ExternalModuleResolver
| Moved into package org.pkl.core.externalreader
| org.pkl.core.resource{wbr}.ExternalResourceResolver
| Moved into package org.pkl.core.externalreader
| org.pkl.core.messaging{wbr}.MessageTransportModuleResolver
| Renamed to ExternalModuleResolverImpl, made package-private
| org.pkl.core.messaging{wbr}.MessageTransportResourceResolver
| Renamed to ExternalResourceResolverImpl, made package-private
| org.pkl.core.module{wbr}.ExternalModuleResolver{wbr}.Spec
| Replaced with record org.pkl.core.externalreader.ModuleReaderSpec
| org.pkl.core.resource{wbr}.ExternalResourceResolver{wbr}.Spec
| Replaced with record org.pkl.core.externalreader.ResourceReaderSpec
| org.pkl.core.messaging{wbr}.CreateEvaluatorRequest
| Changed properties `allowedModules` and `allowedResources` to be of type `List<String>` instead of `List<Pattern>`
| org.pkl.codegen.kotlin{wbr}.KotlinCodegenOptions
| Renamed to org.pkl.codegen.kotlin.KotlinCodeGeneratorOptions
| org.pkl.codegen.kotlin{wbr}.CliKotlinCodeGeneratorOptions{wbr}.toKotlinCodegenOptions
| Deprecated without replacement
| org.pkl.codegen.java{wbr}.JavaCodegenOptions
| Renamed to org.pkl.codegen.java.JavaCodeGeneratorOptions
| org.pkl.codegen.java{wbr}.CliJavaCodeGeneratorOptions{wbr}.toJavaCodegenOptions()
| Deprecated without replacement
|===
=== Fat jars no longer shade Truffle
Pkl publishes two fat jars to Maven Central: https://central.sonatype.com/artifact/org.pkl-lang/pkl-tools[pkl-tools], and https://central.sonatype.com/artifact/org.pkl-lang/pkl-config-java-all[pkl-config-java-all].
Due a version bump in the Truffle library, the package `com.oracle.truffle` can no longer be shaded.
For users that use both Pkl and other Truffle languages, this means that their version of Truffle should match Pkl's version.
== Miscellaneous [small]#🐸#
* Documentation improvements (https://github.com/apple/pkl/pull/792[#792], https://github.com/apple/pkl/pull/846[#846], https://github.com/apple/pkl/pull/860[#860], https://github.com/apple/pkl/pull/892[#892], https://github.com/apple/pkl/pull/921[#921], https://github.com/apple/pkl/pull/937[#937], https://github.com/apple/pkl/pull/943[#943], https://github.com/apple/pkl/pull/944[#944], https://github.com/apple/pkl/pull/955[#955], https://github.com/apple/pkl/pull/956[#956], https://github.com/apple/pkl/pull/973[#973]).
* The repository now requires Java 21 or higher to build (https://github.com/apple/pkl/pull/876[#876]).
* Enable multi-jdk testing via `-DmultiJdkTesting=true` flag when building Pkl (https://github.com/apple/pkl/pull/876[#876]).
* Allow setting commit id via `-DcommitId` flag when building Pkl (https://github.com/apple/pkl/pull/954[#954]).
== Bugs fixed [small]#🐜#
The following bugs have been fixed.
[smaller]
* Optimization: `const` members should be cached for all children in the prototype chain (https://github.com/apple/pkl/issues/508[#508])
* codegen-kotlin: Use same toString() representation for data classes and regular classes (https://github.com/apple/pkl/issues/717[#717])
* Late-bound values of iteratees within nested for/spread fail to resolve for-generator variables (https://github.com/apple/pkl/issues/741[#741])
* codegen-java/kotlin: Fix generation of equals/hashCode methods (https://github.com/apple/pkl/pull/802[#802])
* Not possible to render mapping with Int keys in YAML (https://github.com/apple/pkl/issues/878[#878])
* Parser accepts wrong string escapes (https://github.com/apple/pkl/issues/888[#888])
* Downstream native-image embedders are broken (https://github.com/apple/pkl/issues/907[#907])
* Failed type constraint error messages do not show forced members (https://github.com/apple/pkl/issues/918[#918])
* ANTLR incompatibilities (https://github.com/apple/pkl/issues/927[#927])
* Doc comments with interleaving comments result in an error (https://github.com/apple/pkl/issues/931[#931])
* Spread elements inside an object body don't need separators (https://github.com/apple/pkl/issues/932[#932])
* Correctly set allowed modules/resoures when external reader scheme contain regex control characters (https://github.com/apple/pkl/pull/941[#941])
* Bad import analysis fails with "None (cause has no message)" (https://github.com/apple/pkl/issues/949[#949])
== Contributors [small]#🙏#
We would like to thank the contributors to this release (in alphabetical order):
* https://github.com/gordonbondon[@gordonbondon]
* https://github.com/HT154[@HT154]
* https://github.com/jsoref[@jsoref]
* https://github.com/KushalP[@KushalP]
* https://github.com/netvl[@netvl]
* https://github.com/odenix[@odenix]
* https://github.com/romacafe[@romacafe]
* https://github.com/sgammon[@sgammon]
* https://github.com/sorcix[@sorcix]
* https://github.com/stanleyycheung[@stanleyycheung]
+1 -159
View File
@@ -1,165 +1,6 @@
= Changelog = Changelog
include::ROOT:partial$component-attributes.adoc[] include::ROOT:partial$component-attributes.adoc[]
[[release-0.28.2]]
== 0.28.2 (2025-04-17)
=== Fixes
* Adds an optimization when object bodies with generators produce no members (https://github.com/apple/pkl/pull/1013[#1013]).
* Fixes a runtime crash when `--output-path` points to a directory (https://github.com/apple/pkl/pull/1038[#1038]).
* Fixes a bug that sometimes causes pkl-doc to crash (https://github.com/apple/pkl/pull/1028[#1028]).
=== Miscellaneous
* Documentation improvements (https://github.com/apple/pkl/pull/982[#982], https://github.com/apple/pkl/pull/1010[#1010], https://github.com/apple/pkl/pull/1031[#1031]).
* CI improvements (https://github.com/apple/pkl/pull/1020[#1020]).
=== Contributors ❤️
Thank you to all the contributors for this release!
* https://github.com/JeroenSoeters[@JeroenSoeters]
* https://github.com/KushalP[@KushalP]
* https://github.com/mbvissers[@mbvissers]
* https://github.com/pepicrft[@pepicrft]
[[release-0.28.1]]
== 0.28.1 (2025-03-03)
=== Fixes
* Fixes an issue where Pkl Gradle tasks can possibly fail with `java.lang.UnsatisfiedLinkError` (https://github.com/apple/pkl/pull/995[#995]).
* Fixes an issue where the artifacts pkl-tools and pkl-config-java-all fail with `java.lang.ClassFormatError` (https://github.com/apple/pkl/pull/998[#998]).
=== Changes
* Adds the ability to configure `native-image` build with Gradle system properties (https://github.com/apple/pkl/pull/1001[#1001]).
+
Now, any system property starting with `"pkl.native"` will have that prefix stripped, and the rest passed as CLI arguments to `native-image`. For example, the native-image resource cache can be configured by passing Gradle flag `-Dpkl.native-Dpolyglot.engine.userResourceCache=/my/cache/dir`.
[[release-0.28.0]]
== 0.28.0 (2025-02-26)
xref:0.28.adoc[Release notes]
[[release-0.27.2]]
== 0.27.2 (2025-01-22)
=== Fixes
* Fixes issues where server mode message decoding might result in null pointer exceptions (https://github.com/apple/pkl/pull/853[#853], https://github.com/apple/pkl/pull/882[#882]).
* Fixes an issue where the test report outputs decimal numbers using local-specific decimals (https://github.com/apple/pkl/pull/868[#868]).
* Fixes an issue where the native executables might not run on some environments, resulting in an error like "Fatal error: Failed to create the main Isolate" (https://github.com/apple/pkl/pull/875[#875]).
=== Contributors ❤️
Thank you to all the contributors for this release!
* link:https://github.com/HT154[@HT154]
* link:https://github.com/StefMa[@StefMa]
[[release-0.27.1]]
== 0.27.1 (2024-12-06)
=== Fixes
- Fixes a broken "number literals" link in the 0.27 release notes (https://github.com/apple/pkl/pull/784[#784]).
- Fixes a possible deadlock during external reader process close (https://github.com/apple/pkl/pull/786[#786]).
- Fixes counting elements with computed indices multiple times in length computation of listings (https://github.com/apple/pkl/pull/797[#797]).
- Fixes non Pkl modules being reported in GatherImports task, leading to plugin failures (https://github.com/apple/pkl/pull/821[#821]).
- Fixes a problem where the delegate chain of type casts for Listing/Mapping get unreasonably big, even though the type nodes are the same, which may lead to a stack overflow or performance degradation (https://github.com/apple/pkl/pull/826[#826]).
- Fixes incorrect scoping of type variables in lazy Listing/Mapping type checking in cross-module typealiases (https://github.com/apple/pkl/pull/789[#789]).
- Fixes regression in type checking logic for Listing/Mapping (https://github.com/apple/pkl/pull/789[#789]).
=== Contributors ❤️
Thank you to all the contributors for this release!
* link:https://github.com/GUI[@GUI]
* link:https://github.com/HT154[@HT154]
* link:https://github.com/odenix[@odenix] (formerly @translatenix)
[[release-0.27.0]]
== 0.27.0 (2024-11-05)
xref:0.27.adoc[Release notes]
[[release-0.26.3]]
== 0.26.3 (2024-08-06)
=== Fixes
* Fixes an issue where CLI argument `--property foo=""` is effectively parsed as `--property foo="true"`. This is now parsed as an empty string (https://github.com/apple/pkl/pull/596[#596]).
* Fixes a regression where amending a globbed import or globbed read results in a PklBugException (https://github.com/apple/pkl/pull/607[#607]).
* Fixes an issue around using `file()` notation when using the pkl-gradle plugin on Windows (https://github.com/apple/pkl/pull/611[#611]).
[[release-0.26.2]]
== 0.26.2 (2024-07-18)
=== Fixes
* Fixes a possible race condition where multiple concurrent Pkl evaluations results in a thrown exception when downloading packages (https://github.com/apple/pkl/pull/584[#584]).
[[release-0.26.1]]
== 0.26.1 (2024-06-28)
=== Fixes
* Fixes a regression where native executables fail to run on some environments that don't support newer CPU features (https://github.com/apple/pkl/pull/551[#551]).
* Fixes a `PklBugException` when passing `.` as a project directory to `pkl project resolve` and `pkl project package` (https://github.com/apple/pkl/pull/544[#544]).
=== Changes
* Disable revocation checking of TLS certificates (https://github.com/apple/pkl/pull/553[#553]).
+
As part of HTTP improvements in 0.26, we unwittingly fixed a bug where Pkl does not actually perform cert revocation checks when making HTTPS requests.
This fix, unfortunately, caused a regression in some cases.
For example, this happens when connecting to a server that bears a public trust certificate, while in an environment with no internet access.
This is because the HTTP client needs to check the revocation status of all certificates in the chain.
+
Revocation checks are a nuanced topic with some benefits, and also with its own problem areas.
For this reason, revocation checking is disabled for Pkl's native CLIs.
Users of Pkl's Java APIs will respect the revocation settings set in the JVM.
[[release-0.26.0]]
== 0.26.0 (2024-06-17)
xref:0.26.adoc[Release notes]
[[release-0.25.3]]
== 0.25.3 (2024-03-26)
=== Fixes
* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/357[#357], link:https://github.com/apple/pkl/pull/362[#362])
* Fixes a bug where amending a module that defines an abstract class might cause a Java `AssertionError` (link:https://github.com/apple/pkl/pull/319[#319])
* Fixes a bug where a for/when generator within a lambda declared with `new {}` syntax might not resolve variables correctly (link:https://github.com/apple/pkl/pull/297[#297])
* Fixes a bug where `const` and `local` modifiers are not exported when obtaining a class's mirror in `pkl:reflect` (link:https://github.com/apple/pkl/pull/265[#265]).
=== Miscellaneous
* Documentation improvements (link:https://github.com/apple/pkl/pull/93[#93], link:https://github.com/apple/pkl/pull/106[#106], link:https://github.com/apple/pkl/pull/143[#143], link:https://github.com/apple/pkl/pull/205[#205], link:https://github.com/apple/pkl/pull/214[#214], link:https://github.com/apple/pkl/pull/224[#224], link:https://github.com/apple/pkl/pull/257[#257], link:https://github.com/apple/pkl/pull/270[#270], link:https://github.com/apple/pkl/pull/282[#282], link:https://github.com/apple/pkl/pull/283[#283], link:https://github.com/apple/pkl/pull/299[#299], link:https://github.com/apple/pkl/pull/337[#337], link:https://github.com/apple/pkl/pull/340[#340])
* Build script improvements (link:https://github.com/apple/pkl/pull/253[#253], link:https://github.com/apple/pkl/pull/314[#314], link:https://github.com/apple/pkl/pull/333[#333], link:https://github.com/apple/pkl/pull/338[#338])
=== Changes
* Add `jpkl` to the set of artifacts released to GitHub (link:https://github.com/apple/pkl/pull/314[#314])
=== Contributors ❤️
Thank you to all the contributors for this release!
* link:https://github.com/r1ft1[@r1ft1]
* link:https://github.com/WardsParadox[@WardsParadox]
* link:https://github.com/grantabbott[@grantabbott]
* link:https://github.com/mshakhmaykin[@mshakhmaykin]
* link:https://github.com/d4wae89d498[@d4wae89d498]
* link:https://github.com/KushalP[@KushalP]
* link:https://github.com/zihluwang[@zihluwang]
* link:https://github.com/Malix-off[@Malix-off]
[[release-0.25.2]] [[release-0.25.2]]
== 0.25.2 (2024-02-08) == 0.25.2 (2024-02-08)
@@ -167,6 +8,7 @@ Thank you to all the contributors for this release!
* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/70[#70], * Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/70[#70],
link:https://github.com/apple/pkl/pull/81[#81], link:https://github.com/apple/pkl/pull/96[#96]) link:https://github.com/apple/pkl/pull/81[#81], link:https://github.com/apple/pkl/pull/96[#96])
* Removes errorneously published artifact called "pkl-cli" (link:https://github.com/apple/pkl/pull/98[#98])
* Fixes an issue where a PklBugException produces an incorrect URL to file issues (link:https://github.com/apple/pkl/pull/73[#73]) * Fixes an issue where a PklBugException produces an incorrect URL to file issues (link:https://github.com/apple/pkl/pull/73[#73])
=== Miscellaneous === Miscellaneous
@@ -1,9 +1,4 @@
= Release Notes = Release Notes
The Pkl team aims to release a new version of Pkl in February, June, and October of each year.
* xref:0.28.adoc[0.28 Release Notes]
* xref:0.27.adoc[0.27 Release Notes]
* xref:0.26.adoc[0.26 Release Notes]
* xref:0.25.adoc[0.25 Release Notes] * xref:0.25.adoc[0.25 Release Notes]
* xref:changelog.adoc[Changelog] * xref:changelog.adoc[Changelog]
+1 -1
View File
@@ -12,7 +12,7 @@ XXX
The next release (XXX) is scheduled for XXX (e.g., August 2, 2021). The next release (XXX) is scheduled for XXX (e.g., August 2, 2021).
Please send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. + Please send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[Github]. +
[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub]. [small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].
To get started, follow xref:pkl-cli:index.adoc#installation[Installation].# To get started, follow xref:pkl-cli:index.adoc#installation[Installation].#
+4 -4
View File
@@ -254,7 +254,7 @@ myFoo1: Foo = new Foo { foo = "bar" } // <1>
myFoo2 = new Foo { foo = "bar" } // <2> myFoo2 = new Foo { foo = "bar" } // <2>
---- ----
<1> Unnecessary `new Foo { ... }` <1> Unnecessary `new Foo { ... }`
<2> Unless amending/extending a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`. <2> Unless amending/extendinge a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`.
== Comments == Comments
@@ -270,7 +270,7 @@ Add a single space after `///`.
[source%parsed,{pkl}] [source%parsed,{pkl}]
---- ----
/// The time allotted for eating lunch. /// The time alotted for eating lunch.
/// ///
/// Note: /// Note:
/// * Hamburgers typically take longer to eat than salad. /// * Hamburgers typically take longer to eat than salad.
@@ -300,7 +300,7 @@ A line comment may also be placed at the end of a line, as long as the line does
[source%tested,{pkl}] [source%tested,{pkl}]
---- ----
/// Designates whether it is zebra party time. /// Designates whether it is zebra party time.
partyTime: Boolean // TODO: Add constraints here? partyTime: Booleean // TODO: Add constraints here?
---- ----
=== Block comments === Block comments
@@ -356,7 +356,7 @@ myString = #"foo \ bar \ baz"#
myString = "foo \\ bar \\ baz" myString = "foo \\ bar \\ baz"
---- ----
NOTE: Sometimes, using custom string delimiters makes source code harder to read. For example, the `+\#+` literal reads better using escapes (`"\\#"`) than using custom string delimiters (`+##"\#"##+`). NOTE: Sometimes, using custom string delimiters makes source code harder to read. For example, the `+\#+` literal reads better using escapes (`"\\#"`) than using custom string delimimters (`+##"\#"##+`).
=== Interpolation === Interpolation
+21 -26
View File
@@ -1,31 +1,19 @@
* xref:pkl-cli:index.adoc#installation[Installation]
* xref:language-tutorial:index.adoc[Tutorial]
** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]
** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]
** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]
* xref:language-reference:index.adoc[Language Reference]
* xref:introduction:index.adoc[Introduction] * xref:introduction:index.adoc[Introduction]
** xref:introduction:use-cases.adoc[Use Cases] ** xref:introduction:use-cases.adoc[Use Cases]
** xref:introduction:concepts.adoc[Concepts] ** xref:introduction:concepts.adoc[Concepts]
** xref:introduction:comparison.adoc[Comparison] ** xref:introduction:comparison.adoc[Comparison]
* xref:pkl-cli:index.adoc#installation[Installation]
* xref:language-tutorial:index.adoc[Tutorial]
** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]
** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]
** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]
* xref:ROOT:language.adoc[Language] * xref:ROOT:language.adoc[Language]
** xref:language-tutorial:index.adoc[Tutorial]
** xref:language-reference:index.adoc[Language Reference] ** xref:language-reference:index.adoc[Language Reference]
** xref:ROOT:standard-library.adoc[Standard Library] ** xref:ROOT:standard-library.adoc[Standard Library]
** xref:ROOT:language-bindings.adoc[Language Bindings]
*** xref:java-binding:index.adoc[Java]
**** xref:java-binding:codegen.adoc[Code Generator]
**** xref:pkl-core:index.adoc[pkl-core Library]
**** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]
*** xref:kotlin-binding:index.adoc[Kotlin]
**** xref:kotlin-binding:codegen.adoc[Code Generator]
**** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]
*** xref:swift:ROOT:index.adoc[Swift]
*** xref:go:ROOT:index.adoc[Go]
*** xref:bindings-specification:index.adoc[Specification]
**** xref:bindings-specification:message-passing-api.adoc[Message Passing API]
**** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]
* xref:ROOT:tools.adoc[Tools] * xref:ROOT:tools.adoc[Tools]
** xref:pkl-cli:index.adoc[CLI] ** xref:pkl-cli:index.adoc[CLI]
@@ -36,14 +24,21 @@
*** xref:vscode:ROOT:index.adoc[VSCode] *** xref:vscode:ROOT:index.adoc[VSCode]
*** xref:neovim:ROOT:index.adoc[Neovim] *** xref:neovim:ROOT:index.adoc[Neovim]
* xref:ROOT:language-bindings.adoc[Language Bindings]
** xref:java-binding:index.adoc[Java]
*** xref:java-binding:codegen.adoc[Code Generator]
*** xref:pkl-core:index.adoc[pkl-core Library]
*** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]
** xref:kotlin-binding:index.adoc[Kotlin]
*** xref:kotlin-binding:codegen.adoc[Code Generator]
*** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]
** xref:swift:ROOT:index.adoc[Swift]
** xref:go:ROOT:index.adoc[Go]
* xref:ROOT:examples.adoc[Examples] * xref:ROOT:examples.adoc[Examples]
* xref:ROOT:evolution-and-roadmap.adoc[Evolution and Roadmap]
* xref:release-notes:index.adoc[Release Notes] * xref:release-notes:index.adoc[Release Notes]
** xref:release-notes:0.28.adoc[0.28 Release Notes]
** xref:release-notes:0.27.adoc[0.27 Release Notes]
** xref:release-notes:0.26.adoc[0.26 Release Notes]
** xref:release-notes:0.25.adoc[0.25 Release Notes] ** xref:release-notes:0.25.adoc[0.25 Release Notes]
** xref:release-notes:changelog.adoc[Changelog] ** xref:release-notes:changelog.adoc[Changelog]
+12 -15
View File
@@ -16,15 +16,15 @@ import org.pkl.core.Loggers
import org.pkl.core.SecurityManagers import org.pkl.core.SecurityManagers
import org.pkl.core.StackFrameTransformers import org.pkl.core.StackFrameTransformers
import org.pkl.core.module.ModuleKeyFactories import org.pkl.core.module.ModuleKeyFactories
import org.pkl.core.parser.LexParseException
import org.pkl.core.parser.Parser
import org.pkl.core.parser.antlr.PklParser
import org.pkl.core.repl.ReplRequest import org.pkl.core.repl.ReplRequest
import org.pkl.core.repl.ReplResponse import org.pkl.core.repl.ReplResponse
import org.pkl.core.repl.ReplServer import org.pkl.core.repl.ReplServer
import org.pkl.core.util.IoUtils
import org.pkl.core.http.HttpClient
import org.pkl.core.parser.Parser
import org.pkl.core.parser.ParserError
import org.pkl.core.parser.syntax.ClassProperty
import org.pkl.core.resource.ResourceReaders import org.pkl.core.resource.ResourceReaders
import org.pkl.core.util.IoUtils
import org.antlr.v4.runtime.ParserRuleContext
import java.nio.file.Files import java.nio.file.Files
import kotlin.io.path.isDirectory import kotlin.io.path.isDirectory
import kotlin.io.path.isRegularFile import kotlin.io.path.isRegularFile
@@ -37,10 +37,10 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
private val projectDir = rootProjectDir.resolve("docs") private val projectDir = rootProjectDir.resolve("docs")
private val docsDir = projectDir.resolve("modules") private val docsDir = projectDir.resolve("modules")
private companion object { companion object {
val headingRegex = Regex("""(?u)^\s*(=++)\s*(.+)""") val headingRegex = Regex("""(?u)^\s*(=++)\s*(.+)""")
val collapsibleBlockRegex = Regex("""(?u)^\s*\[%collapsible""") val collapsibleBlockRegex = Regex("""(?u)^\s*\[%collapsible""")
val codeBlockRegex = Regex("""(?u)^\s*\[source(?:%(tested|parsed)(%error)?)?(?:,\{?([a-zA-Z-_]+)}?)?""") val codeBlockRegex = Regex("""(?u)^\s*\[source(?:%(tested|parsed)(%error)?)?(?:,(?:\{)?([a-zA-Z-_]+)}?)?""")
val codeBlockNameRegex = Regex("""(?u)^\s*\.(.+)""") val codeBlockNameRegex = Regex("""(?u)^\s*\.(.+)""")
val codeBlockDelimiterRegex = Regex("""(?u)^\s*----""") val codeBlockDelimiterRegex = Regex("""(?u)^\s*----""")
val graphicsRegex = Regex("\\[small]#.+#") val graphicsRegex = Regex("\\[small]#.+#")
@@ -78,7 +78,6 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
override fun createExecutionContext(request: ExecutionRequest): ExecutionContext { override fun createExecutionContext(request: ExecutionRequest): ExecutionContext {
val replServer = ReplServer( val replServer = ReplServer(
SecurityManagers.defaultManager, SecurityManagers.defaultManager,
HttpClient.dummyClient(),
Loggers.stdErr(), Loggers.stdErr(),
listOf( listOf(
ModuleKeyFactories.standardLibrary, ModuleKeyFactories.standardLibrary,
@@ -95,8 +94,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
null, null,
null, null,
IoUtils.getCurrentWorkingDir(), IoUtils.getCurrentWorkingDir(),
StackFrameTransformers.defaultTransformer, StackFrameTransformers.defaultTransformer
false,
) )
return ExecutionContext(replServer) return ExecutionContext(replServer)
} }
@@ -149,7 +147,6 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
} }
} }
@Suppress("DEPRECATION")
private fun parseAsciidoc(docDescriptor: Descriptor.Path, selectors: List<UniqueIdSelector>) { private fun parseAsciidoc(docDescriptor: Descriptor.Path, selectors: List<UniqueIdSelector>) {
var line = "" var line = ""
var prevLine = "" var prevLine = ""
@@ -302,7 +299,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
override fun getType() = Type.TEST override fun getType() = Type.TEST
private val parsed: org.pkl.core.parser.syntax.Node by lazy { private val parsed: ParserRuleContext by lazy {
when (language) { when (language) {
"pkl" -> Parser().parseModule(code) "pkl" -> Parser().parseModule(code)
"pkl-expr" -> Parser().parseExpressionInput(code) "pkl-expr" -> Parser().parseExpressionInput(code)
@@ -317,7 +314,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
if (expectError) { if (expectError) {
throw AssertionError("Expected a parse error, but got none.") throw AssertionError("Expected a parse error, but got none.")
} }
} catch (e: ParserError) { } catch (e: LexParseException) {
if (!expectError) { if (!expectError) {
throw AssertionError(e.message) throw AssertionError(e.message)
} }
@@ -334,7 +331,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
) )
) )
val properties = parsed.children()?.filterIsInstance<ClassProperty>() ?: emptyList() val properties = parsed.children.filterIsInstance<PklParser.ClassPropertyContext>()
val responses = mutableListOf<ReplResponse>() val responses = mutableListOf<ReplResponse>()
@@ -343,7 +340,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
responses.addAll(context.replServer.handleRequest( responses.addAll(context.replServer.handleRequest(
ReplRequest.Eval( ReplRequest.Eval(
"snippet", "snippet",
prop.name.value, prop.Identifier().text,
false, false,
true true
) )
+1 -4
View File
@@ -1,11 +1,10 @@
# suppress inspection "UnusedProperty" for whole file # suppress inspection "UnusedProperty" for whole file
group=org.pkl-lang group=org.pkl-lang
version=0.28.2 version=0.25.2
# google-java-format requires jdk.compiler exports # google-java-format requires jdk.compiler exports
org.gradle.jvmargs= \ org.gradle.jvmargs= \
-XX:+UseParallelGC \
-Dfile.encoding=UTF-8 \ -Dfile.encoding=UTF-8 \
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
@@ -14,7 +13,5 @@ org.gradle.jvmargs= \
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.caching=true
kotlin.stdlib.default.dependency=false kotlin.stdlib.default.dependency=false
kotlin.daemon.jvmargs=-XX:+UseParallelGC
#org.gradle.workers.max=1 #org.gradle.workers.max=1
+31 -40
View File
@@ -1,59 +1,53 @@
# NOTE: keep in sync with buildSrc/src/main/kotlin/Versions.kt until the latter can be removed
[versions] # ordered alphabetically [versions] # ordered alphabetically
antlr = "4.+" antlr = "4.+"
assertj = "3.+" assertj = "3.+"
checksumPlugin = "1.4.0" checksumPlugin = "1.2.0"
clikt = "5.+" clikt = "3.5.1"
commonMark = "0.+" commonMark = "0.+"
downloadTaskPlugin = "5.6.0" downloadTaskPlugin = "4.1.2"
geantyref = "1.+" geantyref = "1.+"
googleJavaFormat = "1.25.2"
# must not use `+` because used in download URL # must not use `+` because used in download URL
# 23.1.x requires JDK 20+ graalVm = "22.3.1"
graalVm = "24.1.2" # intentionally empty; replaced by patch file when building pkl-cli macos/aarch64
graalVmJdkVersion = "21.0.5" graalVM23JdkVersion = "replace-me"
# slightly hacky but convenient place so we remember to update the checksum # slightly hacky but convenient place so we remember to update the checksum
graalVmSha256-macos-x64 = "2d9b09e28bc1bb6ff219bf62eacc4626c7740b4f1829ede9ea4450f33e9c0826" graalVmSha256-darwin-amd64 = "325afad5f1c4a07a458c95e7c444cff63514a6afa6f2655c12b4f494dccf2228"
graalVmSha256-macos-aarch64 = "cb68cb2c796f42f37a56fcd1385d8b86cca12e0b46c5618a5ed3ec7dd2260f6f" graalVmSha256-linux-amd64 = "55547725a8be3ceb0a1da29a84cd3e958ba398ce4470ac89a8ba1bdb6d9bddb8"
graalVmSha256-linux-x64 = "c1960d4f9d278458bde1cd15115ac2f0b3240cb427d51cfeceb79dab91a7f5c9" graalVmSha256-linux-aarch64 = "b46a3f9c82ac70990a62282b1fbe4474e784d9ba453839a428f88e94d21f8abc"
graalVmSha256-linux-aarch64 = "3ad68fbb2d13da528dfa0aea9e9345383245ec9c31094dce3905cefba9aac01e" ideaExtPlugin = "1.1"
graalVmSha256-windows-x64 = "d5784cbdc87f84b5cbd6c9d09c6f1d4611954f139fcfc795005c58dffd7f6b41" javaPoet = "1.+"
ideaExtPlugin = "1.1.9"
javaPoet = "0.+"
javaxInject = "1" javaxInject = "1"
jansi = "2.+"
jimfs = "1.+" jimfs = "1.+"
# later versions don't work with native image jansi = "2.+"
# (at least not without additional configuration; tested with 3.25.1 and 3.27.1) jline = "3.+"
jline = "3.23.0"
jmh = "1.+" jmh = "1.+"
jmhPlugin = "0.7.2" jmhPlugin = "0.6.6"
jsr305 = "3.+" jsr305 = "3.+"
junit = "5.+" junit = "5.+"
kotlin = "2.0.21" kotlin = "1.7.10"
# 1.7+ generates much more verbose code # 1.7+ generates much more verbose code
kotlinPoet = "1.6.+" kotlinPoet = "1.6.+"
kotlinxHtml = "0.11.0" kotlinxHtml = "0.+"
kotlinxSerialization = "1.8.0" kotlinxSerialization = "1.+"
ktfmt = "0.53"
# replaces nuValidator's log4j dependency # replaces nuValidator's log4j dependency
# something related to log4j-1.2-api is apparently broken in 2.17.2 # something related to log4j-1.2-api is apparently broken in 2.17.2
log4j = "2.17.1" log4j = "2.17.1"
msgpack = "0.9.8"
nexusPublishPlugin = "2.0.0"
nuValidator = "20.+" nuValidator = "20.+"
paguro = "3.+" paguro = "3.+"
shadowPlugin = "8.1.1" shadowPlugin = "7.1.0"
slf4j = "1.+" slf4j = "1.+"
snakeYaml = "2.+" # Breaking change in snakeYaml 2.6 (removing DumpSettingsBuilder::setScalarResolver), so pin to 2.5
spotlessPlugin = "6.25.0" snakeYaml = "2.5"
wiremock = "3.+" spotlessPlugin = "6.11.0"
msgpack = "0.9.0"
nexusPublishPlugin = "1.3.0"
[libraries] # ordered alphabetically [libraries] # ordered alphabetically
antlr = { group = "com.tunnelvisionlabs", name = "antlr4", version.ref = "antlr" } antlr = { group = "com.tunnelvisionlabs", name = "antlr4", version.ref = "antlr" }
antlrRuntime = { group = "com.tunnelvisionlabs", name = "antlr4-runtime", version.ref = "antlr" } antlrRuntime = { group = "com.tunnelvisionlabs", name = "antlr4-runtime", version.ref = "antlr" }
assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertj" } assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertj" }
clikt = { group = "com.github.ajalt.clikt", name = "clikt", version.ref = "clikt" } clikt = { group = "com.github.ajalt.clikt", name = "clikt", version.ref = "clikt" }
cliktMarkdown = { group = "com.github.ajalt.clikt", name = "clikt-markdown", version.ref = "clikt" }
commonMark = { group = "org.commonmark", name = "commonmark", version.ref = "commonMark" } commonMark = { group = "org.commonmark", name = "commonmark", version.ref = "commonMark" }
commonMarkTables = { group = "org.commonmark", name = "commonmark-ext-gfm-tables", version.ref = "commonMark" } commonMarkTables = { group = "org.commonmark", name = "commonmark-ext-gfm-tables", version.ref = "commonMark" }
downloadTaskPlugin = { group = "de.undercouch", name = "gradle-download-task", version.ref = "downloadTaskPlugin" } downloadTaskPlugin = { group = "de.undercouch", name = "gradle-download-task", version.ref = "downloadTaskPlugin" }
@@ -61,10 +55,10 @@ geantyref = { group = "io.leangen.geantyref", name = "geantyref", version.ref =
graalCompiler = { group = "org.graalvm.compiler", name = "compiler", version.ref = "graalVm" } graalCompiler = { group = "org.graalvm.compiler", name = "compiler", version.ref = "graalVm" }
graalSdk = { group = "org.graalvm.sdk", name = "graal-sdk", version.ref = "graalVm" } graalSdk = { group = "org.graalvm.sdk", name = "graal-sdk", version.ref = "graalVm" }
graalJs = { group = "org.graalvm.js", name = "js", version.ref = "graalVm" } graalJs = { group = "org.graalvm.js", name = "js", version.ref = "graalVm" }
javaPoet = { group = "com.palantir.javapoet", name = "javapoet", version.ref = "javaPoet" } javaPoet = { group = "com.squareup", name = "javapoet", version.ref = "javaPoet" }
javaxInject = { group = "javax.inject", name = "javax.inject", version.ref = "javaxInject" } javaxInject = { group = "javax.inject", name = "javax.inject", version.ref = "javaxInject" }
jansi = { group = "org.fusesource.jansi", name = "jansi", version.ref = "jansi" }
jimfs = { group = "com.google.jimfs", name = "jimfs", version.ref = "jimfs" } jimfs = { group = "com.google.jimfs", name = "jimfs", version.ref = "jimfs" }
jansi = { group = "org.fusesource.jansi", name = "jansi", version.ref = "jansi" }
jlineReader = { group = "org.jline", name = "jline-reader", version.ref = "jline" } jlineReader = { group = "org.jline", name = "jline-reader", version.ref = "jline" }
jlineTerminal = { group = "org.jline", name = "jline-terminal", version.ref = "jline" } jlineTerminal = { group = "org.jline", name = "jline-terminal", version.ref = "jline" }
jlineTerminalJansi = { group = "org.jline", name = "jline-terminal-jansi", version.ref = "jline" } jlineTerminalJansi = { group = "org.jline", name = "jline-terminal-jansi", version.ref = "jline" }
@@ -73,20 +67,19 @@ junitApi = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.re
junitEngine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit" } junitEngine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit" }
junitParams = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" } junitParams = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" }
kotlinCompilerEmbeddable = { group = "org.jetbrains.kotlin", name = "kotlin-compiler-embeddable", version.ref = "kotlin" } kotlinCompilerEmbeddable = { group = "org.jetbrains.kotlin", name = "kotlin-compiler-embeddable", version.ref = "kotlin" }
kotlinScriptingCompilerEmbeddable = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-compiler-embeddable", version.ref = "kotlin" }
kotlinScriptUtil = { group = "org.jetbrains.kotlin", name = "kotlin-script-util", version.ref = "kotlin" }
kotlinPlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } kotlinPlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
kotlinPoet = { group = "com.squareup", name = "kotlinpoet", version.ref = "kotlinPoet" } kotlinPoet = { group = "com.squareup", name = "kotlinpoet", version.ref = "kotlinPoet" }
kotlinReflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } kotlinReflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" }
kotlinScripting = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-jsr223", version.ref = "kotlin" }
kotlinStdLib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlinStdLib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" }
kotlinxHtml = { group = "org.jetbrains.kotlinx", name = "kotlinx-html-jvm", version.ref = "kotlinxHtml" } kotlinxHtml = { group = "org.jetbrains.kotlinx", name = "kotlinx-html-jvm", version.ref = "kotlinxHtml" }
kotlinxSerializationJson = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" } kotlinxSerializationJson = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
log4j12Api = { group = "org.apache.logging.log4j", name = "log4j-1.2-api", version.ref = "log4j" } log4j12Api = { group = "org.apache.logging.log4j", name = "log4j-1.2-api", version.ref = "log4j" }
msgpack = { group = "org.msgpack", name = "msgpack-core", version.ref = "msgpack" }
nuValidator = { group = "nu.validator", name = "validator", version.ref = "nuValidator" } nuValidator = { group = "nu.validator", name = "validator", version.ref = "nuValidator" }
# to be replaced with https://github.com/usethesource/capsule or https://github.com/lacuna/bifurcan # to be replaced with https://github.com/usethesource/capsule or https://github.com/lacuna/bifurcan
paguro = { group = "org.organicdesign", name = "Paguro", version.ref = "paguro" } paguro = { group = "org.organicdesign", name = "Paguro", version.ref = "paguro" }
pklConfigJavaAll025 = { group = "org.pkl-lang", name = "pkl-config-java-all", version = "0.25.0" } shadowPlugin = { group = "gradle.plugin.com.github.johnrengelman", name = "shadow", version.ref = "shadowPlugin" }
shadowPlugin = { group = "com.github.johnrengelman", name = "shadow", version.ref = "shadowPlugin" }
slf4jApi = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" } slf4jApi = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" }
slf4jSimple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" } slf4jSimple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
snakeYaml = { group = "org.snakeyaml", name = "snakeyaml-engine", version.ref = "snakeYaml" } snakeYaml = { group = "org.snakeyaml", name = "snakeyaml-engine", version.ref = "snakeYaml" }
@@ -94,14 +87,12 @@ spotlessPlugin = { group = "com.diffplug.spotless", name = "spotless-plugin-grad
svm = { group = "org.graalvm.nativeimage", name = "svm", version.ref = "graalVm" } svm = { group = "org.graalvm.nativeimage", name = "svm", version.ref = "graalVm" }
truffleApi = { group = "org.graalvm.truffle", name = "truffle-api", version.ref = "graalVm" } truffleApi = { group = "org.graalvm.truffle", name = "truffle-api", version.ref = "graalVm" }
truffleDslProcessor = { group = "org.graalvm.truffle", name = "truffle-dsl-processor", version.ref = "graalVm" } truffleDslProcessor = { group = "org.graalvm.truffle", name = "truffle-dsl-processor", version.ref = "graalVm" }
truffleSvm = { group = "org.graalvm.nativeimage", name = "truffle-runtime-svm", version.ref = "graalVm" } msgpack = { group = "org.msgpack", name = "msgpack-core", version.ref = "msgpack" }
truffleRuntime = { group = "org.graalvm.truffle", name = "truffle-runtime", version.ref = "graalVm" }
wiremock = { group = "org.wiremock", name = "wiremock", version.ref = "wiremock" }
[plugins] # ordered alphabetically [plugins] # ordered alphabetically
checksum = { id = "org.gradle.crypto.checksum", version.ref = "checksumPlugin" } checksum = { id = "org.gradle.crypto.checksum", version.ref = "checksumPlugin" }
ideaExt = { id = "org.jetbrains.gradle.plugin.idea-ext", version.ref = "ideaExtPlugin" } ideaExt = { id = "org.jetbrains.gradle.plugin.idea-ext", version.ref = "ideaExtPlugin" }
jmh = { id = "me.champeau.jmh", version.ref = "jmhPlugin" } jmh = { id = "me.champeau.jmh", version.ref = "jmhPlugin" }
kotlinxSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlinxSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexusPublishPlugin" }
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadowPlugin" } shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadowPlugin" }
nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexusPublishPlugin" }
Binary file not shown.
+1 -4
View File
@@ -1,8 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionSha256Sum=8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94 distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
Vendored
+13 -30
View File
@@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@@ -57,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@@ -82,11 +80,13 @@ do
esac esac
done done
# This is normally unused APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@@ -133,29 +133,22 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
if ! command -v java >/dev/null 2>&1 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@@ -200,15 +193,11 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# Collect all arguments for the java command: # * put everything else in single quotes, so that it's not re-expanded.
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
@@ -216,12 +205,6 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \ org.gradle.wrapper.GradleWrapperMain \
"$@" "$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

Some files were not shown because too many files have changed in this diff Show More