mirror of
https://github.com/apple/pkl.git
synced 2026-01-11 22:30:54 +01:00
Compare commits
424 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bd738ec0b | ||
|
|
7569b96088 | ||
|
|
ad131b5543 | ||
|
|
640cc129db | ||
|
|
1d14a750a5 | ||
|
|
6a1d56bb4d | ||
|
|
0902cbc628 | ||
|
|
7717b702b2 | ||
|
|
c5c0c20caa | ||
|
|
fc1114fd2e | ||
|
|
2b24d2838c | ||
|
|
917d110e46 | ||
|
|
11cc9b96bd | ||
|
|
ab9a231341 | ||
|
|
cf18ce3d65 | ||
|
|
a225258ebf | ||
|
|
393d939a2c | ||
|
|
52c2b29a04 | ||
|
|
cf889246fd | ||
|
|
fcce5c7e11 | ||
|
|
52a86d3f32 | ||
|
|
31c80e792e | ||
|
|
50cfb1c962 | ||
|
|
643c6f5a76 | ||
|
|
227f0637fc | ||
|
|
baa34a6dd1 | ||
|
|
2ffd201172 | ||
|
|
ee23a8c3f4 | ||
|
|
28b128f86f | ||
|
|
d270829ed3 | ||
|
|
350b71a634 | ||
|
|
28df90527b | ||
|
|
eabfcdd333 | ||
|
|
1a4f9ee72e | ||
|
|
65cf3237b7 | ||
|
|
d00d0ba79f | ||
|
|
f56b1bb84f | ||
|
|
b526902bf0 | ||
|
|
7c3f8ad261 | ||
|
|
7ed710c226 | ||
|
|
ad99e4a7f7 | ||
|
|
e85e888f92 | ||
|
|
3b6fbdff15 | ||
|
|
9784cd7265 | ||
|
|
aadcccd0fc | ||
|
|
9075ca0729 | ||
|
|
5e12dfb200 | ||
|
|
408242a44c | ||
|
|
8cfd2357c6 | ||
|
|
3fa935b390 | ||
|
|
aa8a0f18e8 | ||
|
|
3815a0206b | ||
|
|
90df0662af | ||
|
|
11169d6691 | ||
|
|
5dc672731d | ||
|
|
258eda8630 | ||
|
|
cdd6d52642 | ||
|
|
29049ac437 | ||
|
|
2a9b10097d | ||
|
|
257bd6f699 | ||
|
|
75bd21420b | ||
|
|
273d1219a6 | ||
|
|
ec7d7267dc | ||
|
|
3096da1920 | ||
|
|
100dd0560e | ||
|
|
3296dd8a89 | ||
|
|
160e4a5636 | ||
|
|
267de3c789 | ||
|
|
f6c74e90a8 | ||
|
|
467e64f98e | ||
|
|
d9c65d484a | ||
|
|
a014e8d1d1 | ||
|
|
6fd82a5bb8 | ||
|
|
29fb99ffea | ||
|
|
efe1608bd6 | ||
|
|
6cab47067b | ||
|
|
17f431370a | ||
|
|
9982511513 | ||
|
|
6bd8e288ef | ||
|
|
01bf844a96 | ||
|
|
70aaa6322e | ||
|
|
1bc473ba54 | ||
|
|
ad06a96a8a | ||
|
|
1abd174d77 | ||
|
|
45302c8a00 | ||
|
|
e6c1e1411b | ||
|
|
cc579f8fd6 | ||
|
|
b93cb9b322 | ||
|
|
7c1604b264 | ||
|
|
0c6808566f | ||
|
|
51df2f3aa4 | ||
|
|
09bc09d058 | ||
|
|
16af6b7bcc | ||
|
|
2a7eec592d | ||
|
|
dda457aa8e | ||
|
|
696a325511 | ||
|
|
9a27616956 | ||
|
|
406fa4cf40 | ||
|
|
df38011c9e | ||
|
|
b8d90eddec | ||
|
|
9faff5e551 | ||
|
|
3f91824dc2 | ||
|
|
dddbb27143 | ||
|
|
3246a0e449 | ||
|
|
a22a8a8127 | ||
|
|
ff60f61cbb | ||
|
|
0d199892b8 | ||
|
|
a533e53838 | ||
|
|
44fd680e43 | ||
|
|
33bffbe158 | ||
|
|
7eedcf1e50 | ||
|
|
a85a173faa | ||
|
|
b402463f3c | ||
|
|
6d161ce1d4 | ||
|
|
40a08affa6 | ||
|
|
4b4d81ba93 | ||
|
|
9692504b5f | ||
|
|
fa25fb46fd | ||
|
|
3f38173ed5 | ||
|
|
d50179827d | ||
|
|
03462fefae | ||
|
|
e217cfcd6f | ||
|
|
66d751f093 | ||
|
|
1be1fe4863 | ||
|
|
cc72f9d160 | ||
|
|
a03827951c | ||
|
|
71db4d0fae | ||
|
|
dd16f7469e | ||
|
|
acd2222534 | ||
|
|
666f8c3939 | ||
|
|
466ae6fd4c | ||
|
|
08be6be059 | ||
|
|
8fa3acf32f | ||
|
|
8b0118fec5 | ||
|
|
93cc3253eb | ||
|
|
1ceb489d78 | ||
|
|
4b6bc7bb7c | ||
|
|
cbbcca0d84 | ||
|
|
22c9a6c9f4 | ||
|
|
069a5d1adc | ||
|
|
86d870ba09 | ||
|
|
2040f14b07 | ||
|
|
730257861f | ||
|
|
f9fe226eba | ||
|
|
5a654e453c | ||
|
|
9d10832ffc | ||
|
|
ce25cb8ef0 | ||
|
|
eb3891b21f | ||
|
|
0aa4819cea | ||
|
|
a7cc098925 | ||
|
|
0ee3d37524 | ||
|
|
5057bb5b17 | ||
|
|
9abf1de7de | ||
|
|
84f4ec863c | ||
|
|
d271b62543 | ||
|
|
62c796a257 | ||
|
|
9b5c5a5c98 | ||
|
|
2add291375 | ||
|
|
7ac51f1f88 | ||
|
|
1022cf3ff3 | ||
|
|
421711be10 | ||
|
|
475f29c896 | ||
|
|
d00c466843 | ||
|
|
7f26592360 | ||
|
|
4854027a1a | ||
|
|
2961cdad19 | ||
|
|
b76ff0f858 | ||
|
|
bc9d526b7a | ||
|
|
3600582908 | ||
|
|
1e63c48ce4 | ||
|
|
9e7e42eb53 | ||
|
|
b072794d0d | ||
|
|
cc1e432a30 | ||
|
|
47f2143e0d | ||
|
|
7868d9d9c8 | ||
|
|
7001a42149 | ||
|
|
a8f24c9f13 | ||
|
|
e5b7e046d9 | ||
|
|
ef0433a9ba | ||
|
|
a9c4963a4a | ||
|
|
e21db76efe | ||
|
|
bbdc45656c | ||
|
|
c445770261 | ||
|
|
b1c2015321 | ||
|
|
7c4904429f | ||
|
|
d5e86ed077 | ||
|
|
604b042d1b | ||
|
|
e3133f604b | ||
|
|
bfc2d7abbf | ||
|
|
0704b8cd83 | ||
|
|
e81a47a038 | ||
|
|
176ede0002 | ||
|
|
24cc95abcc | ||
|
|
b5e011dae1 | ||
|
|
cdf548cad0 | ||
|
|
5cc2ea2d00 | ||
|
|
527d236ba4 | ||
|
|
8c1c10528f | ||
|
|
7a9b571f6e | ||
|
|
3659ad8b7a | ||
|
|
0d7b95d3ff | ||
|
|
49aaf288cc | ||
|
|
51d7265ec6 | ||
|
|
420336dc78 | ||
|
|
70e77347f3 | ||
|
|
3b786878fd | ||
|
|
64bfcfdc4f | ||
|
|
5c950d2e73 | ||
|
|
0ef22a73fb | ||
|
|
4a27ac5bda | ||
|
|
570c2085b3 | ||
|
|
d55866a04b | ||
|
|
600939457a | ||
|
|
e996a342cc | ||
|
|
00c2e00bb9 | ||
|
|
bcee291fdc | ||
|
|
4a7f90157a | ||
|
|
f15ad6ec06 | ||
|
|
380095c8a7 | ||
|
|
9c287a2e48 | ||
|
|
3bd9214858 | ||
|
|
919de4838c | ||
|
|
d7a1778199 | ||
|
|
b03530ed1f | ||
|
|
a520ae7d04 | ||
|
|
21749f5c82 | ||
|
|
a4c0a271b4 | ||
|
|
9cc9816440 | ||
|
|
d5ba8fa736 | ||
|
|
c0a7080287 | ||
|
|
207d0c78f0 | ||
|
|
d81a12352c | ||
|
|
a48748cb9c | ||
|
|
5b7123131f | ||
|
|
8ec06e631f | ||
|
|
5e4ccfd4e8 | ||
|
|
47f161a211 | ||
|
|
c1949a99b0 | ||
|
|
d0def765a2 | ||
|
|
5f4d475d84 | ||
|
|
a5c13e325a | ||
|
|
110dc89e86 | ||
|
|
2d31bc5ef5 | ||
|
|
7da643fc8f | ||
|
|
21aa44cfc4 | ||
|
|
aeb17588b3 | ||
|
|
d28313bca8 | ||
|
|
27d8a030b1 | ||
|
|
b5208a2b5b | ||
|
|
c959888f0b | ||
|
|
ea3e8f115b | ||
|
|
e49a36e318 | ||
|
|
ae69e4776f | ||
|
|
5feaa2aaf7 | ||
|
|
ed1b317801 | ||
|
|
0d3400fb59 | ||
|
|
fd1c294146 | ||
|
|
c3a99f8ae6 | ||
|
|
b433500e04 | ||
|
|
f857223511 | ||
|
|
c331dede3c | ||
|
|
b9e94b94ae | ||
|
|
e28d747418 | ||
|
|
a7c7e51180 | ||
|
|
3ab9e4184e | ||
|
|
583dfc6927 | ||
|
|
3a31188cc1 | ||
|
|
5de90d5868 | ||
|
|
76f1b92039 | ||
|
|
81bfdb7cbd | ||
|
|
31917d1556 | ||
|
|
ccf95d2af1 | ||
|
|
5510bf12d2 | ||
|
|
52ce6815d1 | ||
|
|
5fa598f636 | ||
|
|
e688b4d4e1 | ||
|
|
2f0436ff2f | ||
|
|
6e2ea07986 | ||
|
|
90b461aa58 | ||
|
|
f71323024c | ||
|
|
889e64586a | ||
|
|
af66532377 | ||
|
|
033db30b04 | ||
|
|
bba5387f17 | ||
|
|
309e3ff4f6 | ||
|
|
375b88f53e | ||
|
|
3c6df1fe34 | ||
|
|
2392a3c22f | ||
|
|
0f9ef53126 | ||
|
|
35490dc559 | ||
|
|
d916345d2c | ||
|
|
57f45c80c6 | ||
|
|
58ed8242af | ||
|
|
3bd91b92ee | ||
|
|
28448b5512 | ||
|
|
759d4806c0 | ||
|
|
c28e478d5a | ||
|
|
4bdfe40816 | ||
|
|
e347b26cf6 | ||
|
|
c9ed183891 | ||
|
|
11a2343a65 | ||
|
|
deaf6983c4 | ||
|
|
60bcd56672 | ||
|
|
1a16619522 | ||
|
|
7584fb8d25 | ||
|
|
dfe85b786e | ||
|
|
2aa60eaf1f | ||
|
|
7e948d317c | ||
|
|
46d65506d5 | ||
|
|
5d0d2ce7a1 | ||
|
|
2bf1fa215a | ||
|
|
4ce7a82db5 | ||
|
|
76f3890cff | ||
|
|
e4ccf517fa | ||
|
|
1f68cf0251 | ||
|
|
4be03b0eaf | ||
|
|
6264f4b631 | ||
|
|
496e064caf | ||
|
|
faa7ac69bb | ||
|
|
9c1ae0d683 | ||
|
|
014b3a8816 | ||
|
|
1e608b2aae | ||
|
|
8dc258ef7d | ||
|
|
9defe868c0 | ||
|
|
3fb1f03780 | ||
|
|
3f3dfdeb1e | ||
|
|
106743354c | ||
|
|
11f07d1ce8 | ||
|
|
4f3858aaaf | ||
|
|
d7196e1207 | ||
|
|
9c3a761cfa | ||
|
|
0ae9e0c5c0 | ||
|
|
6746040362 | ||
|
|
ddfab2a280 | ||
|
|
b0161a4777 | ||
|
|
2499e2c493 | ||
|
|
813572f0d2 | ||
|
|
90dedb7837 | ||
|
|
b7b0e65cc6 | ||
|
|
96c0e5fb03 | ||
|
|
32bc75bf50 | ||
|
|
7f404fff49 | ||
|
|
48a000aa1a | ||
|
|
2c54643037 | ||
|
|
a85ffd3cab | ||
|
|
115e775d1b | ||
|
|
d756dff0e7 | ||
|
|
9cc1796429 | ||
|
|
eb170017f6 | ||
|
|
8f130d8d49 | ||
|
|
c652bbe5cd | ||
|
|
ca31185302 | ||
|
|
21e0e149ac | ||
|
|
1e50200969 | ||
|
|
cb33a7cdb0 | ||
|
|
fc0f6f1ef0 | ||
|
|
611ab3b55c | ||
|
|
1cfcc5ec38 | ||
|
|
dd49236e00 | ||
|
|
6175d16d6a | ||
|
|
91367ed065 | ||
|
|
ffc629f28f | ||
|
|
277f1e0cdb | ||
|
|
50a006b1b5 | ||
|
|
bbb4d828a0 | ||
|
|
3b2feb45cf | ||
|
|
0405db8d80 | ||
|
|
3d1db25864 | ||
|
|
1c29287344 | ||
|
|
699cdc623e | ||
|
|
810a755702 | ||
|
|
c3473cc626 | ||
|
|
a49526649d | ||
|
|
1b208f852c | ||
|
|
1a1d2f9908 | ||
|
|
0b680be32b | ||
|
|
f2470f3e85 | ||
|
|
7d9603afd7 | ||
|
|
8c254a9976 | ||
|
|
14dec716cf | ||
|
|
aa98123c93 | ||
|
|
da597d838d | ||
|
|
b3fb5dced6 | ||
|
|
4bf6d3069d | ||
|
|
28d98b461b | ||
|
|
99717c61af | ||
|
|
a28ef85698 | ||
|
|
6f915e5b90 | ||
|
|
db55c527c6 | ||
|
|
0a3a618091 | ||
|
|
5ce205c2c0 | ||
|
|
4f1189c163 | ||
|
|
97f4193c15 | ||
|
|
dddae1190f | ||
|
|
9dc7eb2938 | ||
|
|
8e6ddfb9b7 | ||
|
|
71fd8591ae | ||
|
|
20adac9919 | ||
|
|
77d0f5b8ca | ||
|
|
a6e59c07ff | ||
|
|
52bc9612ea | ||
|
|
5a311d3b86 | ||
|
|
e9df244485 | ||
|
|
604bb83acb | ||
|
|
5a8d8680c4 | ||
|
|
9bc7ada4ae | ||
|
|
0538044fee | ||
|
|
bb3e3929ac | ||
|
|
9f4fd58577 | ||
|
|
5c541aa168 | ||
|
|
3f8fae4873 | ||
|
|
f0ae1be76a | ||
|
|
90c60c700d | ||
|
|
6eb3d20b47 | ||
|
|
b3ccdda222 | ||
|
|
eeb9f0b86e | ||
|
|
58e7cc188a | ||
|
|
ba52ac73da | ||
|
|
d5bd21fc69 | ||
|
|
27ecb8c389 | ||
|
|
80aff3afad | ||
|
|
38f2e9a1cf | ||
|
|
6e75c4a656 | ||
|
|
ce65290aae |
@@ -14,7 +14,7 @@
|
||||
// limitations under the License.
|
||||
//===----------------------------------------------------------------------===//
|
||||
// File gets rendered to .circleci/config.yml via git hook.
|
||||
amends ".../pkl-project-commons/packages/pkl.impl.circleci/PklCI.pkl"
|
||||
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.2.0#/PklCI.pkl"
|
||||
|
||||
import "jobs/BuildNativeJob.pkl"
|
||||
import "jobs/GradleCheckJob.pkl"
|
||||
@@ -25,13 +25,13 @@ local prbJobs: Listing<String> = gradleCheckJobs.keys.toListing()
|
||||
|
||||
local buildAndTestJobs = (prbJobs) {
|
||||
"bench"
|
||||
// "gradle-compatibility"
|
||||
"gradle-compatibility"
|
||||
...buildNativeJobs.keys.filter((it) -> it.endsWith("snapshot"))
|
||||
}
|
||||
|
||||
local releaseJobs = (prbJobs) {
|
||||
"bench"
|
||||
// "gradle-compatibility"
|
||||
"gradle-compatibility"
|
||||
...buildNativeJobs.keys.filter((it) -> it.endsWith("release"))
|
||||
}
|
||||
|
||||
@@ -71,6 +71,10 @@ release {
|
||||
}
|
||||
}
|
||||
|
||||
releaseBranch {
|
||||
jobs = releaseJobs
|
||||
}
|
||||
|
||||
triggerDocsBuild = "both"
|
||||
|
||||
triggerPackageDocsBuild = "release"
|
||||
@@ -92,17 +96,24 @@ local buildNativeJobs: Mapping<String, BuildNativeJob> = new {
|
||||
musl = true
|
||||
isRelease = _dist == "release"
|
||||
}
|
||||
["pkl-cli-windows-amd64-\(_dist)"] {
|
||||
arch = "amd64"
|
||||
os = "windows"
|
||||
isRelease = _dist == "release"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
local gradleCheckJobs: Mapping<String, GradleCheckJob> = new {
|
||||
["gradle-check-jdk11"] {
|
||||
javaVersion = "11.0"
|
||||
["gradle-check"] {
|
||||
javaVersion = "21.0"
|
||||
isRelease = false
|
||||
os = "linux"
|
||||
}
|
||||
["gradle-check-jdk17"] {
|
||||
javaVersion = "17.0"
|
||||
["gradle-check-windows"] {
|
||||
javaVersion = "21.0"
|
||||
isRelease = false
|
||||
os = "windows"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,28 +129,27 @@ jobs {
|
||||
name = "gradle compatibility"
|
||||
command = #"""
|
||||
:pkl-gradle:build \
|
||||
:pkl-gradle:compatibilityTestReleases \
|
||||
:pkl-gradle:compatibilityTestCandidate
|
||||
:pkl-gradle:compatibilityTestReleases
|
||||
"""#
|
||||
}.job
|
||||
["deploy-snapshot"] = new DeployJob {
|
||||
command = "publishToSonatype"
|
||||
}.job
|
||||
["deploy-snapshot"] = new DeployJob { command = "publishToSonatype" }.job
|
||||
["deploy-release"] = new DeployJob {
|
||||
isRelease = true
|
||||
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
|
||||
}.job
|
||||
["github-release"] {
|
||||
docker {
|
||||
new {
|
||||
image = "maniator/gh:v2.40.1"
|
||||
}
|
||||
new { image = "maniator/gh:v2.40.1" }
|
||||
}
|
||||
steps {
|
||||
new AttachWorkspaceStep { at = "." }
|
||||
new RunStep {
|
||||
name = "Publish release on GitHub"
|
||||
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}" \
|
||||
--title "${CIRCLE_TAG}" \
|
||||
--target "${CIRCLE_SHA1}" \
|
||||
|
||||
@@ -9,28 +9,34 @@ jobs:
|
||||
- run:
|
||||
command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||
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:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
resource_class: macos.m1.large.gen1
|
||||
JAVA_HOME: /Users/distiller/jdk/Contents/Home
|
||||
resource_class: m2pro.large
|
||||
macos:
|
||||
xcode: 15.2.0
|
||||
xcode: 15.3.0
|
||||
pkl-cli-linux-amd64-release:
|
||||
steps:
|
||||
- checkout
|
||||
@@ -45,8 +51,8 @@ jobs:
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
curl -Lf \
|
||||
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
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -58,7 +64,7 @@ jobs:
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf 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 \
|
||||
&& cd /tmp/dep_zlib-1.2.13 \
|
||||
@@ -71,7 +77,7 @@ jobs:
|
||||
|
||||
# install musl
|
||||
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
|
||||
curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
|
||||
mkdir -p /tmp/dep_musl-1.2.2 \
|
||||
&& cd /tmp/dep_musl-1.2.2 \
|
||||
@@ -94,18 +100,12 @@ jobs:
|
||||
- run:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
@@ -118,29 +118,33 @@ jobs:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: git apply patches/graalVm23.patch
|
||||
command: |-
|
||||
# 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:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
resource_class: macos.m1.large.gen1
|
||||
JAVA_HOME: /Users/distiller/jdk/Contents/Home
|
||||
resource_class: m2pro.large
|
||||
macos:
|
||||
xcode: 15.2.0
|
||||
xcode: 15.3.0
|
||||
pkl-cli-linux-aarch64-release:
|
||||
steps:
|
||||
- checkout
|
||||
@@ -155,8 +159,8 @@ jobs:
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
curl -Lf \
|
||||
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
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -168,7 +172,7 @@ jobs:
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf 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 \
|
||||
&& cd /tmp/dep_zlib-1.2.13 \
|
||||
@@ -188,18 +192,12 @@ jobs:
|
||||
- run:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
@@ -222,8 +220,8 @@ jobs:
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
curl -Lf \
|
||||
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
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -235,7 +233,7 @@ jobs:
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf 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 \
|
||||
&& cd /tmp/dep_zlib-1.2.13 \
|
||||
@@ -248,7 +246,7 @@ jobs:
|
||||
|
||||
# install musl
|
||||
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
|
||||
curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
|
||||
mkdir -p /tmp/dep_musl-1.2.2 \
|
||||
&& cd /tmp/dep_musl-1.2.2 \
|
||||
@@ -271,18 +269,12 @@ jobs:
|
||||
- run:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
@@ -291,34 +283,73 @@ jobs:
|
||||
resource_class: xlarge
|
||||
docker:
|
||||
- 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:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: /usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||
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:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:macExecutableAmd64 pkl-core:testMacExecutableAmd64 pkl-server:testMacExecutableAmd64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
resource_class: macos.m1.large.gen1
|
||||
JAVA_HOME: /Users/distiller/jdk/Contents/Home
|
||||
resource_class: m2pro.large
|
||||
macos:
|
||||
xcode: 15.2.0
|
||||
xcode: 15.3.0
|
||||
pkl-cli-linux-amd64-snapshot:
|
||||
steps:
|
||||
- checkout
|
||||
@@ -333,8 +364,8 @@ jobs:
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
curl -Lf \
|
||||
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
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -346,7 +377,7 @@ jobs:
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf 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 \
|
||||
&& cd /tmp/dep_zlib-1.2.13 \
|
||||
@@ -359,7 +390,7 @@ jobs:
|
||||
|
||||
# install musl
|
||||
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
|
||||
curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
|
||||
mkdir -p /tmp/dep_musl-1.2.2 \
|
||||
&& cd /tmp/dep_musl-1.2.2 \
|
||||
@@ -382,18 +413,12 @@ jobs:
|
||||
- run:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:linuxExecutableAmd64 pkl-core:testLinuxExecutableAmd64 pkl-server:testLinuxExecutableAmd64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
@@ -406,29 +431,33 @@ jobs:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: git apply patches/graalVm23.patch
|
||||
command: |-
|
||||
# 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:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:macExecutableAarch64 pkl-core:testMacExecutableAarch64 pkl-server:testMacExecutableAarch64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
resource_class: macos.m1.large.gen1
|
||||
JAVA_HOME: /Users/distiller/jdk/Contents/Home
|
||||
resource_class: m2pro.large
|
||||
macos:
|
||||
xcode: 15.2.0
|
||||
xcode: 15.3.0
|
||||
pkl-cli-linux-aarch64-snapshot:
|
||||
steps:
|
||||
- checkout
|
||||
@@ -443,8 +472,8 @@ jobs:
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
curl -Lf \
|
||||
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
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -456,7 +485,7 @@ jobs:
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf 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 \
|
||||
&& cd /tmp/dep_zlib-1.2.13 \
|
||||
@@ -476,18 +505,12 @@ jobs:
|
||||
- run:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:linuxExecutableAarch64 pkl-core:testLinuxExecutableAarch64 pkl-server:testLinuxExecutableAarch64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
@@ -510,8 +533,8 @@ jobs:
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
curl -Lf \
|
||||
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
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -523,7 +546,7 @@ jobs:
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf 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 \
|
||||
&& cd /tmp/dep_zlib-1.2.13 \
|
||||
@@ -536,7 +559,7 @@ jobs:
|
||||
|
||||
# install musl
|
||||
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
|
||||
curl -L https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
curl -Lf https://musl.libc.org/releases/musl-1.2.2.tar.gz -o /tmp/musl.tar.gz
|
||||
|
||||
mkdir -p /tmp/dep_musl-1.2.2 \
|
||||
&& cd /tmp/dep_musl-1.2.2 \
|
||||
@@ -559,18 +582,12 @@ jobs:
|
||||
- run:
|
||||
command: |-
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew --info --stacktrace pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true pkl-cli:alpineExecutableAmd64 pkl-core:testAlpineExecutableAmd64 pkl-server:testAlpineExecutableAmd64
|
||||
name: gradle buildNative
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
@@ -579,125 +596,147 @@ jobs:
|
||||
resource_class: xlarge
|
||||
docker:
|
||||
- image: oraclelinux:8-slim
|
||||
gradle-check-jdk11:
|
||||
pkl-cli-windows-amd64-snapshot:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: ./gradlew --info --stacktrace check
|
||||
name: gradle check
|
||||
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: |-
|
||||
mkdir ~/test-results/
|
||||
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
|
||||
name: Gather test results
|
||||
when: always
|
||||
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
|
||||
- store_test_results:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
docker:
|
||||
- image: cimg/openjdk:11.0
|
||||
gradle-check-jdk17:
|
||||
- image: cimg/openjdk:21.0
|
||||
gradle-check-windows:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: ./gradlew --info --stacktrace 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
|
||||
# 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
|
||||
- store_test_results:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
docker:
|
||||
- image: cimg/openjdk:17.0
|
||||
JAVA_HOME: /jdk
|
||||
resource_class: windows.large
|
||||
machine:
|
||||
image: windows-server-2022-gui:current
|
||||
bench:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: ./gradlew --info --stacktrace bench:jmh
|
||||
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true 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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
docker:
|
||||
- image: cimg/openjdk:11.0
|
||||
- image: cimg/openjdk:21.0
|
||||
gradle-compatibility:
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
command: |-
|
||||
./gradlew --info --stacktrace :pkl-gradle:build \
|
||||
:pkl-gradle:compatibilityTestReleases \
|
||||
:pkl-gradle:compatibilityTestCandidate
|
||||
./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true :pkl-gradle:build \
|
||||
:pkl-gradle:compatibilityTestReleases
|
||||
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:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
docker:
|
||||
- image: cimg/openjdk:11.0
|
||||
- image: cimg/openjdk:21.0
|
||||
deploy-snapshot:
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: '.'
|
||||
- run:
|
||||
command: ./gradlew --info --stacktrace publishToSonatype
|
||||
- run:
|
||||
command: |-
|
||||
mkdir ~/test-results/
|
||||
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
|
||||
name: Gather test results
|
||||
when: always
|
||||
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true publishToSonatype
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- pkl-cli/build/executable/
|
||||
- store_test_results:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
docker:
|
||||
- image: cimg/openjdk:11.0
|
||||
- image: cimg/openjdk:21.0
|
||||
deploy-release:
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: '.'
|
||||
- run:
|
||||
command: ./gradlew --info --stacktrace -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
|
||||
- run:
|
||||
command: |-
|
||||
mkdir ~/test-results/
|
||||
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/ \;
|
||||
name: Gather test results
|
||||
when: always
|
||||
command: ./gradlew --info --stacktrace -DtestReportsDir=${HOME}/test-results -DpklMultiJdkTesting=true -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository
|
||||
- persist_to_workspace:
|
||||
root: '.'
|
||||
paths:
|
||||
- pkl-cli/build/executable/
|
||||
- store_test_results:
|
||||
path: ~/test-results
|
||||
environment:
|
||||
LANG: en_US.UTF-8
|
||||
docker:
|
||||
- image: cimg/openjdk:11.0
|
||||
- image: cimg/openjdk:21.0
|
||||
github-release:
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: '.'
|
||||
- run:
|
||||
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}" \
|
||||
--title "${CIRCLE_TAG}" \
|
||||
--target "${CIRCLE_SHA1}" \
|
||||
@@ -741,38 +780,40 @@ workflows:
|
||||
type: approval
|
||||
- pr-approval/authenticate:
|
||||
context: pkl-pr-approval
|
||||
- gradle-check-jdk11:
|
||||
- gradle-check:
|
||||
requires:
|
||||
- hold
|
||||
- pr-approval/authenticate
|
||||
- gradle-check-jdk17:
|
||||
- gradle-check-windows:
|
||||
requires:
|
||||
- hold
|
||||
- pr-approval/authenticate
|
||||
when:
|
||||
matches:
|
||||
value: << pipeline.git.branch >>
|
||||
pattern: ^pull/\d+(/head)?$
|
||||
main:
|
||||
jobs:
|
||||
- gradle-check-jdk11
|
||||
- gradle-check-jdk17
|
||||
- gradle-check
|
||||
- gradle-check-windows
|
||||
- bench
|
||||
- gradle-compatibility
|
||||
- pkl-cli-macOS-amd64-snapshot
|
||||
- pkl-cli-linux-amd64-snapshot
|
||||
- pkl-cli-macOS-aarch64-snapshot
|
||||
- pkl-cli-linux-aarch64-snapshot
|
||||
- pkl-cli-linux-alpine-amd64-snapshot
|
||||
- pkl-cli-windows-amd64-snapshot
|
||||
- deploy-snapshot:
|
||||
requires:
|
||||
- gradle-check-jdk11
|
||||
- gradle-check-jdk17
|
||||
- gradle-check
|
||||
- gradle-check-windows
|
||||
- bench
|
||||
- gradle-compatibility
|
||||
- pkl-cli-macOS-amd64-snapshot
|
||||
- pkl-cli-linux-amd64-snapshot
|
||||
- pkl-cli-macOS-aarch64-snapshot
|
||||
- pkl-cli-linux-aarch64-snapshot
|
||||
- pkl-cli-linux-alpine-amd64-snapshot
|
||||
- pkl-cli-windows-amd64-snapshot
|
||||
context: pkl-maven-release
|
||||
- trigger-docsite-build:
|
||||
requires:
|
||||
@@ -785,13 +826,13 @@ workflows:
|
||||
- << pipeline.git.branch >>
|
||||
release:
|
||||
jobs:
|
||||
- gradle-check-jdk11:
|
||||
- gradle-check:
|
||||
filters:
|
||||
branches:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: /^v?\d+\.\d+\.\d+$/
|
||||
- gradle-check-jdk17:
|
||||
- gradle-check-windows:
|
||||
filters:
|
||||
branches:
|
||||
ignore: /.*/
|
||||
@@ -803,6 +844,12 @@ workflows:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: /^v?\d+\.\d+\.\d+$/
|
||||
- gradle-compatibility:
|
||||
filters:
|
||||
branches:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: /^v?\d+\.\d+\.\d+$/
|
||||
- pkl-cli-macOS-amd64-release:
|
||||
filters:
|
||||
branches:
|
||||
@@ -833,16 +880,24 @@ workflows:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: /^v?\d+\.\d+\.\d+$/
|
||||
- pkl-cli-windows-amd64-release:
|
||||
filters:
|
||||
branches:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: /^v?\d+\.\d+\.\d+$/
|
||||
- github-release:
|
||||
requires:
|
||||
- gradle-check-jdk11
|
||||
- gradle-check-jdk17
|
||||
- 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
|
||||
context: pkl-github-release
|
||||
filters:
|
||||
branches:
|
||||
@@ -868,3 +923,19 @@ workflows:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
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+$
|
||||
|
||||
@@ -16,12 +16,7 @@
|
||||
/// Builds the native `pkl` CLI
|
||||
extends "GradleJob.pkl"
|
||||
|
||||
// TODO(oss) replace these with package imports
|
||||
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
|
||||
import ".../pkl-pantry/packages/pkl.experimental.uri/URI.pkl"
|
||||
|
||||
/// The OS to run on
|
||||
os: "macOS"|"linux"
|
||||
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl"
|
||||
|
||||
/// The architecture to use
|
||||
arch: "amd64"|"aarch64"
|
||||
@@ -29,13 +24,11 @@ arch: "amd64"|"aarch64"
|
||||
/// Whether to link to musl. Otherwise, links to glibc.
|
||||
musl: Boolean = false
|
||||
|
||||
local setupLinuxEnvironment: CircleCI.RunStep =
|
||||
let (jdkVersion = "11.0.20.1+1")
|
||||
javaVersion = "21.0"
|
||||
|
||||
local setupLinuxEnvironment: Config.RunStep =
|
||||
let (muslVersion = "1.2.2")
|
||||
let (zlibVersion = "1.2.13")
|
||||
let (jdkVersionEncoded = URI.encodeComponent(jdkVersion))
|
||||
let (jdkVersionAlt = jdkVersion.replaceLast("+", "_"))
|
||||
let (majorJdkVersion = jdkVersion.split(".").first)
|
||||
new {
|
||||
name = "Set up environment"
|
||||
shell = "#!/bin/bash -exo pipefail"
|
||||
@@ -47,8 +40,8 @@ local setupLinuxEnvironment: CircleCI.RunStep =
|
||||
&& rm -rf /var/cache/dnf
|
||||
|
||||
# install jdk
|
||||
curl -L \
|
||||
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
|
||||
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")_linux_hotspot_\#(module.jdkVersionAlt).tar.gz -o /tmp/jdk.tar.gz
|
||||
|
||||
mkdir /jdk \
|
||||
&& cd /jdk \
|
||||
@@ -60,7 +53,7 @@ local setupLinuxEnvironment: CircleCI.RunStep =
|
||||
|
||||
# install zlib
|
||||
if [[ ! -f ~/staticdeps/include/zlib.h ]]; then
|
||||
curl -L https://github.com/madler/zlib/releases/download/v\#(zlibVersion)/zlib-\#(zlibVersion).tar.gz -o /tmp/zlib.tar.gz
|
||||
curl -Lf https://github.com/madler/zlib/releases/download/v\#(zlibVersion)/zlib-\#(zlibVersion).tar.gz -o /tmp/zlib.tar.gz
|
||||
|
||||
mkdir -p /tmp/dep_zlib-\#(zlibVersion) \
|
||||
&& cd /tmp/dep_zlib-\#(zlibVersion) \
|
||||
@@ -76,7 +69,7 @@ local setupLinuxEnvironment: CircleCI.RunStep =
|
||||
#"""
|
||||
# install musl
|
||||
if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then
|
||||
curl -L https://musl.libc.org/releases/musl-\#(muslVersion).tar.gz -o /tmp/musl.tar.gz
|
||||
curl -Lf https://musl.libc.org/releases/musl-\#(muslVersion).tar.gz -o /tmp/musl.tar.gz
|
||||
|
||||
mkdir -p /tmp/dep_musl-\#(muslVersion) \
|
||||
&& cd /tmp/dep_musl-\#(muslVersion) \
|
||||
@@ -94,14 +87,30 @@ local setupLinuxEnvironment: CircleCI.RunStep =
|
||||
}.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 {
|
||||
when (os == "linux") {
|
||||
new CircleCI.RestoreCacheStep {
|
||||
new Config.RestoreCacheStep {
|
||||
name = "Restore static deps from cache"
|
||||
key = "staticdeps-\(arch)"
|
||||
}
|
||||
setupLinuxEnvironment
|
||||
new CircleCI.SaveCacheStep {
|
||||
new Config.SaveCacheStep {
|
||||
name = "Save statics deps to cache"
|
||||
key = "staticdeps-\(arch)"
|
||||
paths {
|
||||
@@ -109,35 +118,34 @@ steps {
|
||||
}
|
||||
}
|
||||
}
|
||||
when (os == "macOS" && arch == "amd64") {
|
||||
new CircleCI.RunStep {
|
||||
name = "Installing Rosetta 2"
|
||||
command = """
|
||||
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||
"""
|
||||
when (os == "macOS") {
|
||||
when (arch == "amd64") {
|
||||
new Config.RunStep {
|
||||
name = "Installing Rosetta 2"
|
||||
command = """
|
||||
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||
"""
|
||||
}
|
||||
}
|
||||
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 CircleCI.RunStep {
|
||||
command = "git apply patches/graalVm23.patch"
|
||||
}
|
||||
}
|
||||
new CircleCI.RunStep {
|
||||
new Config.RunStep {
|
||||
name = "gradle buildNative"
|
||||
local _os =
|
||||
if (os == "macOS") "mac"
|
||||
if (module.os == "macOS") "mac"
|
||||
else if (musl) "alpine"
|
||||
else if (module.os == "windows") "windows"
|
||||
else "linux"
|
||||
local jobName = "\(_os)Executable\(arch.capitalize())"
|
||||
when (module.os == "windows") {
|
||||
shell = "bash.exe"
|
||||
}
|
||||
command = #"""
|
||||
export PATH=~/staticdeps/bin:$PATH
|
||||
./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize())
|
||||
./gradlew \#(module.gradleArgs) pkl-cli:\#(jobName) pkl-core:test\#(jobName.capitalize()) pkl-server:test\#(jobName.capitalize())
|
||||
"""#
|
||||
}
|
||||
new CircleCI.PersistToWorkspaceStep {
|
||||
new Config.PersistToWorkspaceStep {
|
||||
root = "."
|
||||
paths {
|
||||
"pkl-cli/build/executable/"
|
||||
@@ -148,13 +156,15 @@ steps {
|
||||
job {
|
||||
when (os == "macOS") {
|
||||
macos {
|
||||
xcode = "15.2.0"
|
||||
xcode = "15.3.0"
|
||||
}
|
||||
// Use M1 for all architectures. We build amd64/aarch64 based on the GraalVM version,
|
||||
// which gets patched in via `git apply patches/graalVm23.patch`.
|
||||
resource_class = "macos.m1.large.gen1"
|
||||
} else {
|
||||
docker {
|
||||
resource_class = "m2pro.large"
|
||||
environment {
|
||||
["JAVA_HOME"] = "/Users/distiller/jdk/Contents/Home"
|
||||
}
|
||||
}
|
||||
when (os == "linux") {
|
||||
docker = new Listing<Config.DockerImage> {
|
||||
new {
|
||||
image = if (arch == "aarch64") "arm64v8/oraclelinux:8-slim" else "oraclelinux:8-slim"
|
||||
}
|
||||
@@ -164,4 +174,13 @@ job {
|
||||
}
|
||||
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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,21 +15,26 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
extends "GradleJob.pkl"
|
||||
|
||||
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
|
||||
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl"
|
||||
|
||||
local self = this
|
||||
|
||||
javaVersion = "21.0"
|
||||
|
||||
command: String
|
||||
|
||||
job {
|
||||
docker {
|
||||
new { image = "cimg/openjdk:11.0" }
|
||||
}
|
||||
}
|
||||
os = "linux"
|
||||
|
||||
steps {
|
||||
new CircleCI.AttachWorkspaceStep { at = "." }
|
||||
new CircleCI.RunStep {
|
||||
new Config.AttachWorkspaceStep { at = "." }
|
||||
new Config.RunStep {
|
||||
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/"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,21 +15,11 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
extends "GradleJob.pkl"
|
||||
|
||||
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
|
||||
|
||||
javaVersion: "11.0"|"17.0"
|
||||
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl"
|
||||
|
||||
steps {
|
||||
new CircleCI.RunStep {
|
||||
new Config.RunStep {
|
||||
name = "gradle check"
|
||||
command = "./gradlew \(module.gradleArgs) check"
|
||||
}
|
||||
}
|
||||
|
||||
job {
|
||||
docker {
|
||||
new {
|
||||
image = "cimg/openjdk:\(javaVersion)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,38 +15,86 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
abstract module GradleJob
|
||||
|
||||
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.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/pkl.experimental.uri@1.0.3#/URI.pkl"
|
||||
|
||||
/// Whether this is a release build or not.
|
||||
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 {
|
||||
"--info"
|
||||
"--stacktrace"
|
||||
"-DtestReportsDir=${HOME}/test-results"
|
||||
"-DpklMultiJdkTesting=true"
|
||||
when (isRelease) {
|
||||
"-DreleaseBuild=true"
|
||||
}
|
||||
}.join(" ")
|
||||
|
||||
steps: Listing<CircleCI.Step>
|
||||
steps: Listing<Config.Step>
|
||||
|
||||
job: CircleCI.Job = new {
|
||||
job: Config.Job = new {
|
||||
environment {
|
||||
["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 {
|
||||
"checkout"
|
||||
...module.steps
|
||||
new CircleCI.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"
|
||||
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
|
||||
"""#
|
||||
}
|
||||
}
|
||||
new CircleCI.StoreTestResults {
|
||||
...module.steps
|
||||
new Config.StoreTestResults {
|
||||
path = "~/test-results"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,23 +15,21 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
extends "GradleJob.pkl"
|
||||
|
||||
import ".../pkl-pantry/packages/com.circleci.v2/CircleCI.pkl"
|
||||
import "package://pkg.pkl-lang.org/pkl-pantry/com.circleci.v2@1.5.0#/Config.pkl"
|
||||
|
||||
name: String = command
|
||||
|
||||
command: String
|
||||
|
||||
os = "linux"
|
||||
|
||||
javaVersion = "21.0"
|
||||
|
||||
steps {
|
||||
new CircleCI.RunStep {
|
||||
new Config.RunStep {
|
||||
name = module.name
|
||||
command = """
|
||||
./gradlew \(module.gradleArgs) \(module.command)
|
||||
"""
|
||||
}
|
||||
}
|
||||
|
||||
job {
|
||||
docker {
|
||||
new { image = "cimg/openjdk:11.0" }
|
||||
}
|
||||
}
|
||||
|
||||
2
.git-blame-ignore-revs
Normal file
2
.git-blame-ignore-revs
Normal file
@@ -0,0 +1,2 @@
|
||||
# Auto-format Kotlin code
|
||||
816cd483c8adf4c04e14236c173a1dc6bd2579ea
|
||||
12
.gitattributes
vendored
12
.gitattributes
vendored
@@ -3,4 +3,14 @@
|
||||
|
||||
/docs/** linguist-documentation
|
||||
|
||||
*.pkl linguist-language=Groovy
|
||||
*.pcf linguist-language=Pkl
|
||||
PklProject linguist-language=Pkl
|
||||
|
||||
* text eol=lf
|
||||
*.bat text eol=crlf
|
||||
|
||||
*.gif binary
|
||||
*.jar binary
|
||||
*.woff2 binary
|
||||
*.pem binary
|
||||
*.png binary
|
||||
|
||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -5,15 +5,23 @@
|
||||
.gradle/
|
||||
build/
|
||||
generated/
|
||||
testgenerated/
|
||||
|
||||
# IntelliJ
|
||||
.idea/
|
||||
!.idea/icon.svg
|
||||
!.idea/codestyles/
|
||||
!.idea/inspectionProfiles/
|
||||
!.idea/runConfigurations/
|
||||
!.idea/scopes/
|
||||
!.idea/vcs.xml
|
||||
|
||||
.vscode/
|
||||
|
||||
.pkl-lsp/
|
||||
|
||||
# :pkl-core:makeIntelliJAntlrPluginHappy
|
||||
gen/
|
||||
PklLexer.tokens
|
||||
|
||||
.kotlin/
|
||||
|
||||
23
.idea/icon.svg
generated
Normal file
23
.idea/icon.svg
generated
Normal file
@@ -0,0 +1,23 @@
|
||||
<?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>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
33
.idea/inspectionProfiles/Project_Default.xml
generated
33
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -15,6 +15,37 @@
|
||||
<inspection_tool class="FieldMayBeFinal" enabled="true" level="INFORMATION" enabled_by_default="true">
|
||||
<scope name="AllExceptTruffleAst" level="WARNING" enabled="true" />
|
||||
</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="NullableProblems" enabled="true" level="WARNING" enabled_by_default="false">
|
||||
<scope name="AllExceptGenerated" level="WARNING" enabled="true">
|
||||
@@ -43,4 +74,4 @@
|
||||
<option name="processComments" value="true" />
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
||||
</component>
|
||||
|
||||
2
.idea/scopes/AllExceptTruffleAst.xml
generated
2
.idea/scopes/AllExceptTruffleAst.xml
generated
@@ -1,3 +1,3 @@
|
||||
<component name="DependencyValidationManager">
|
||||
<scope name="AllExceptTruffleAst" pattern="(src:*..*||test:*..*||lib:*..*)&&!src[pkl.pkl-core.main]:com.apple.pkl.core.ast..*&&!src[pkl.pkl-core.main]:com.apple.pkl.core.stdlib..*Nodes" />
|
||||
<scope name="AllExceptTruffleAst" pattern="(src:*..*||test:*..*||lib:*..*)&&!src[pkl.pkl-core.main]:org.pkl.core.ast..*&&!src[pkl.pkl-core.main]:org.pkl.core.stdlib..*Nodes" />
|
||||
</component>
|
||||
|
||||
@@ -1 +1 @@
|
||||
17.0
|
||||
21
|
||||
|
||||
@@ -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
|
||||
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,
|
||||
race, religion, or sexual identity and orientation.
|
||||
|
||||
=== Our Standards
|
||||
### Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
@@ -33,7 +33,7 @@ electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
=== Our Responsibilities
|
||||
### Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of
|
||||
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
|
||||
deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
=== Scope
|
||||
### Scope
|
||||
|
||||
This Code of Conduct applies within all project spaces, and it also
|
||||
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
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
=== Enforcement
|
||||
### Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may
|
||||
be reported by contacting the open source team at
|
||||
@@ -70,9 +70,8 @@ Project maintainers who do not follow or enforce the Code of Conduct in
|
||||
good faith may face temporary or permanent repercussions as determined
|
||||
by other members of the project’s leadership.
|
||||
|
||||
=== Attribution
|
||||
### Attribution
|
||||
|
||||
This Code of Conduct is adapted from the
|
||||
https://www.contributor-covenant.org[Contributor Covenant], version 1.4,
|
||||
available at
|
||||
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
[Contributor Covenant](https://www.contributor-covenant.org), version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
@@ -2,20 +2,22 @@
|
||||
:uri-gng: https://gng.dsun.org
|
||||
:uri-jenv: https://www.jenv.be
|
||||
:uri-intellij: https://www.jetbrains.com/idea/download/
|
||||
:uri-jdk: https://adoptopenjdk.net/releases.html
|
||||
:uri-native-prerequisites-linux: https://www.graalvm.org/latest/getting-started/linux/#prerequisites-for-native-image-on-linux
|
||||
:uri-native-prerequisites-windows: https://www.graalvm.org/latest/getting-started/windows/#prerequisites-for-native-image-on-windows
|
||||
|
||||
== Setup
|
||||
|
||||
. (mandatory) Install {uri-jdk}[OpenJDK 11 HotSpot] (as long as we support JDK11)
|
||||
. (mandatory) Setup Gradle on your system
|
||||
. (recommended) Install {uri-intellij}[IntelliJ IDEA 2023.x] +
|
||||
. (mandatory) Install a JDK (JDK 21+ required).
|
||||
. (recommended) Install {uri-intellij}[IntelliJ IDEA] +
|
||||
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
|
||||
and click its "Import Gradle Project" link.
|
||||
. (recommended) Install {uri-gng}[gng] +
|
||||
_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 +
|
||||
_jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 17. +
|
||||
_jenv_ use specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 21. +
|
||||
Enable _jenv_ plugins for better handling by `gradle`:
|
||||
+
|
||||
[source,shell]
|
||||
@@ -23,20 +25,39 @@ Enable _jenv_ plugins for better handling by `gradle`:
|
||||
jenv enable-plugin gradle
|
||||
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
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
gw clean
|
||||
gw test
|
||||
gw test # run all tests except native executable tests
|
||||
gw testNative # run native executable tests
|
||||
gw spotlessApply # fix code formatting
|
||||
gw build # build everything except native executables
|
||||
gw buildNative # build macOS executable on macOS,
|
||||
# Linux and Alpine executables on Linux
|
||||
gw pkldoc # generate standard library docs
|
||||
gw buildNative # build native executable(s) for current platform
|
||||
# (Alpine executable is only built if ~/staticdeps/bin/musl-gcc exists)
|
||||
|
||||
pkl-cli/build/executable/jpkl # run Java executable
|
||||
pkl-cli/build/executable/pkl-macos-amd64 # run Mac 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 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
|
||||
@@ -62,16 +83,18 @@ 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`
|
||||
** Output dir is `generated/truffle/`
|
||||
* ANTLR code generation is performed by task `:pkl-core:generateGrammarSource`
|
||||
** Output dir is `generated/antlr/`
|
||||
* ANTLR code generation is performed by task `:pkl-core:generateTestGrammarSource`
|
||||
** Output dir is `testgenerated/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
|
||||
|
||||
=== 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]
|
||||
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.
|
||||
|
||||
=== Truffle
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright © 2024 Apple Inc. and the Pkl project authors
|
||||
Copyright © 2024-2025 Apple Inc. and the Pkl project authors
|
||||
|
||||
|
||||
Portions of this software were originally based on 'SnakeYAML' developed by Andrey Somov.
|
||||
|
||||
79
README.adoc
79
README.adoc
@@ -1,4 +1,4 @@
|
||||
= Pkl
|
||||
= image:.idea/icon.svg[Pkl,30] Pkl
|
||||
|
||||
:uri-homepage: https://pkl-lang.org
|
||||
:uri-docs: {uri-homepage}/main/current
|
||||
@@ -11,6 +11,8 @@
|
||||
: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-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.
|
||||
|
||||
@@ -34,3 +36,78 @@ We'd love to hear from you!
|
||||
|
||||
* Create an {uri-github-issue}[issue]
|
||||
* 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
|
||||
|===
|
||||
|
||||
@@ -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.
|
||||
|
||||
== Reporting a security vulnerability
|
||||
## Reporting a security vulnerability
|
||||
|
||||
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.
|
||||
|
||||
Security vulnerabilities may be reported on the link:https://security.apple.com/submit[Report a vulnerability] form.
|
||||
Security vulnerabilities may be reported on the [Report a vulnerability](https://security.apple.com/submit) form.
|
||||
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.
|
||||
@@ -26,18 +26,7 @@ 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
|
||||
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) 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)
|
||||
4) GeantyRef (https://github.com/leangen/geantyref)
|
||||
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
|
||||
@@ -47,7 +36,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
|
||||
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.
|
||||
|
||||
6) commonmark-java core
|
||||
5) commonmark-java core
|
||||
POM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause
|
||||
|
||||
Embedded license:
|
||||
@@ -78,7 +67,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
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
7) commonmark-java extension for tables
|
||||
6) commonmark-java extension for tables
|
||||
POM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause
|
||||
|
||||
Embedded license:
|
||||
@@ -109,7 +98,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
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
8) jansi (http://fusesource.com/)
|
||||
7) jansi (http://fusesource.com/)
|
||||
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
|
||||
@@ -119,13 +108,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
|
||||
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.
|
||||
|
||||
9) Graal Sdk (https://github.com/oracle/graal)
|
||||
8) Graal Sdk (https://github.com/oracle/graal)
|
||||
POM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL
|
||||
|
||||
10) Truffle API (http://openjdk.java.net/projects/graal)
|
||||
9) Truffle API (http://openjdk.java.net/projects/graal)
|
||||
POM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL
|
||||
|
||||
11) IntelliJ IDEA Annotations (http://www.jetbrains.org)
|
||||
10) IntelliJ IDEA Annotations (http://www.jetbrains.org)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -133,7 +122,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
|
||||
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-reflect (https://kotlinlang.org/)
|
||||
11) kotlin-reflect (https://kotlinlang.org/)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -141,7 +130,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
|
||||
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 (https://kotlinlang.org/)
|
||||
12) kotlin-stdlib (https://kotlinlang.org/)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -149,7 +138,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
|
||||
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-common (https://kotlinlang.org/)
|
||||
13) kotlin-stdlib-common (https://kotlinlang.org/)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -157,7 +146,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
|
||||
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-jdk7 (https://kotlinlang.org/)
|
||||
14) kotlin-stdlib-jdk7 (https://kotlinlang.org/)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -165,7 +154,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
|
||||
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) kotlin-stdlib-jdk8 (https://kotlinlang.org/)
|
||||
15) kotlin-stdlib-jdk8 (https://kotlinlang.org/)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -173,7 +162,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
|
||||
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.html (https://github.com/Kotlin/kotlinx.html)
|
||||
16) kotlinx.html (https://github.com/Kotlin/kotlinx.html)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -181,7 +170,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
|
||||
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-core (https://github.com/Kotlin/kotlinx.serialization)
|
||||
17) kotlinx-serialization-core (https://github.com/Kotlin/kotlinx.serialization)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -189,7 +178,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
|
||||
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) kotlinx-serialization-json (https://github.com/Kotlin/kotlinx.serialization)
|
||||
18) kotlinx-serialization-json (https://github.com/Kotlin/kotlinx.serialization)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -197,7 +186,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
|
||||
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.
|
||||
|
||||
20) JLine Reader
|
||||
19) JLine Reader
|
||||
Manifest license URL: https://opensource.org/licenses/BSD-3-Clause
|
||||
|
||||
POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause
|
||||
@@ -216,7 +205,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.
|
||||
|
||||
21) JLine Terminal
|
||||
20) JLine Terminal
|
||||
Manifest license URL: https://opensource.org/licenses/BSD-3-Clause
|
||||
|
||||
POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause
|
||||
@@ -235,7 +224,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.
|
||||
|
||||
22) JLine JANSI Terminal
|
||||
21) JLine JANSI Terminal
|
||||
Manifest license URL: https://opensource.org/licenses/BSD-3-Clause
|
||||
|
||||
POM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause
|
||||
@@ -254,7 +243,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.
|
||||
|
||||
23) msgpack-core (https://msgpack.org/)
|
||||
22) msgpack-core (https://msgpack.org/)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -262,7 +251,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
|
||||
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.
|
||||
|
||||
24) Paguro (https://github.com/GlenKPeterson/Paguro)
|
||||
23) Paguro (https://github.com/GlenKPeterson/Paguro)
|
||||
POM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
The Apache License
|
||||
@@ -364,7 +353,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.
|
||||
|
||||
25) SnakeYAML Engine (http://www.snakeyaml.org)
|
||||
24) SnakeYAML Engine (http://www.snakeyaml.org)
|
||||
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
|
||||
|
||||
@@ -1,31 +1,44 @@
|
||||
/*
|
||||
* 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 {
|
||||
pklAllProjects
|
||||
pklJavaLibrary
|
||||
pklGraalVm
|
||||
id("me.champeau.jmh")
|
||||
}
|
||||
|
||||
val truffle: Configuration by configurations.creating
|
||||
val graal: Configuration by configurations.creating
|
||||
|
||||
@Suppress("UnstableApiUsage")
|
||||
dependencies {
|
||||
jmh(project(":pkl-core"))
|
||||
// necessary because antlr4-runtime is declared as implementation dependency in pkl-core.gradle
|
||||
jmh(libs.antlrRuntime)
|
||||
jmh(projects.pklCore)
|
||||
jmh(projects.pklCommonsTest)
|
||||
truffle(libs.truffleApi)
|
||||
graal(libs.graalCompiler)
|
||||
}
|
||||
|
||||
jmh {
|
||||
//include = ["fib_class_java"]
|
||||
//include = ["fib_class_constrained1", "fib_class_constrained2"]
|
||||
// include = ["fib_class_java"]
|
||||
// include = ["fib_class_constrained1", "fib_class_constrained2"]
|
||||
jmhVersion.set(libs.versions.jmh)
|
||||
// jvmArgsAppend = "-Dgraal.TruffleCompilationExceptionsAreFatal=true " +
|
||||
// "-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true " +
|
||||
// "-Dgraal.TruffleFunctionInlining=false"
|
||||
jvm.set("${buildInfo.graalVm.baseDir}/bin/java")
|
||||
// see: https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
|
||||
jvm.set("${buildInfo.graalVmAmd64.baseDir}/bin/java")
|
||||
// see:
|
||||
// https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation
|
||||
jvmArgs.set(
|
||||
listOf(
|
||||
// one JVM arg per list element doesn't work, but the following does
|
||||
@@ -33,16 +46,13 @@ jmh {
|
||||
)
|
||||
)
|
||||
includeTests.set(false)
|
||||
//threads = Runtime.runtime.availableProcessors() / 2 + 1
|
||||
//synchronizeIterations = false
|
||||
// threads = Runtime.runtime.availableProcessors() / 2 + 1
|
||||
// synchronizeIterations = false
|
||||
}
|
||||
|
||||
tasks.named("jmh") {
|
||||
dependsOn(":installGraalVm")
|
||||
}
|
||||
tasks.named("jmh") { dependsOn(":installGraalVmAmd64") }
|
||||
|
||||
// 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 been set."
|
||||
tasks.processJmhResources {
|
||||
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||
}
|
||||
// "Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has
|
||||
// been set."
|
||||
tasks.processJmhResources { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|
||||
|
||||
@@ -1,43 +1,62 @@
|
||||
# This is a Gradle generated file for dependency locking.
|
||||
# Manual edits can break the build and are not advised.
|
||||
# This file is expected to be part of source control.
|
||||
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.bytebuddy:byte-buddy:1.15.11=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
net.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.apache.commons:commons-math3:3.2=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.graalvm.compiler:compiler:22.3.1=graal
|
||||
org.graalvm.sdk:graal-sdk:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
|
||||
org.graalvm.truffle:truffle-api:22.3.1=graal,jmh,jmhRuntimeClasspath,truffle
|
||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10=kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-script-runtime:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit.jupiter:junit-jupiter-engine:5.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit.platform:junit-platform-engine:1.9.3=testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.openjdk.jmh:jmh-core:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.openjdk.jmh:jmh-generator-asm:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.openjdk.jmh:jmh-generator-bytecode:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.openjdk.jmh:jmh-generator-reflection:1.36=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.apache.commons:commons-math3:3.6.1=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.apiguardian:apiguardian-api:1.1.2=jmhCompileClasspath,jmhImplementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testJdk17CompileClasspath,testJdk17ImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||
org.assertj:assertj-core:3.27.3=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.graalvm.compiler:compiler:24.1.2=graal
|
||||
org.graalvm.polyglot:polyglot:24.1.2=jmh,jmhRuntimeClasspath,truffle
|
||||
org.graalvm.sdk:collections:24.1.2=graal,jmh,jmhRuntimeClasspath,truffle
|
||||
org.graalvm.sdk:graal-sdk:24.1.2=jmh,jmhRuntimeClasspath
|
||||
org.graalvm.sdk:nativeimage:24.1.2=jmh,jmhRuntimeClasspath,truffle
|
||||
org.graalvm.sdk:word:24.1.2=graal,jmh,jmhRuntimeClasspath,truffle
|
||||
org.graalvm.truffle:truffle-api:24.1.2=jmh,jmhRuntimeClasspath,truffle
|
||||
org.graalvm.truffle:truffle-compiler:24.1.2=graal
|
||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-build-common:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-build-tools-impl:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-daemon-client:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.0.21=kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration
|
||||
org.jetbrains.kotlin:kotlin-reflect:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-script-runtime:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-scripting-common:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
|
||||
org.jetbrains.kotlin:kotlin-scripting-jvm:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib:2.0.21=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains:annotations:13.0=jmh,jmhCompileClasspath,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestJdk17,kotlinKlibCommonizerClasspath,testCompileClasspath,testRuntimeClasspath
|
||||
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.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath
|
||||
org.snakeyaml:snakeyaml-engine:2.5=jmh,jmhRuntimeClasspath
|
||||
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
|
||||
org.snakeyaml:snakeyaml-engine:2.9=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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
/*
|
||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
|
||||
import org.openjdk.jmh.annotations.*;
|
||||
import org.openjdk.jmh.util.TempFile;
|
||||
import org.openjdk.jmh.util.TempFileManager;
|
||||
import org.pkl.core.http.HttpClient;
|
||||
import org.pkl.core.module.ModuleKeyFactories;
|
||||
import org.pkl.core.repl.ReplRequest;
|
||||
import org.pkl.core.repl.ReplResponse;
|
||||
@@ -39,6 +40,7 @@ public class ListSort {
|
||||
private static final ReplServer repl =
|
||||
new ReplServer(
|
||||
SecurityManagers.defaultManager,
|
||||
HttpClient.dummyClient(),
|
||||
Loggers.stdErr(),
|
||||
List.of(ModuleKeyFactories.standardLibrary),
|
||||
List.of(ResourceReaders.file()),
|
||||
@@ -48,7 +50,8 @@ public class ListSort {
|
||||
null,
|
||||
null,
|
||||
IoUtils.getCurrentWorkingDir(),
|
||||
StackFrameTransformers.defaultTransformer);
|
||||
StackFrameTransformers.defaultTransformer,
|
||||
false);
|
||||
private static final List<Object> list = new ArrayList<>(100000);
|
||||
|
||||
static {
|
||||
@@ -109,10 +112,10 @@ public class ListSort {
|
||||
// append `.length` to avoid rendering the list
|
||||
new ReplRequest.Eval("sort", "nums.sortWith(cmp).length", false, false))
|
||||
.get(0);
|
||||
if (!(response instanceof ReplResponse.EvalSuccess)) {
|
||||
if (!(response instanceof ReplResponse.EvalSuccess success)) {
|
||||
throw new AssertionError(response);
|
||||
}
|
||||
return ((ReplResponse.EvalSuccess) response).getResult();
|
||||
return success.getResult();
|
||||
}
|
||||
|
||||
// note that this is an uneven comparison
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||
/*
|
||||
* 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.
|
||||
@@ -15,8 +15,15 @@
|
||||
*/
|
||||
package org.pkl.core.parser;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
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")
|
||||
@Warmup(iterations = 5, time = 2)
|
||||
@@ -24,36 +31,33 @@ import org.openjdk.jmh.annotations.*;
|
||||
@OutputTimeUnit(TimeUnit.SECONDS)
|
||||
@Fork(1)
|
||||
public class ParserBenchmark {
|
||||
// One-time execution of this code took ~10s until moving rule alternative
|
||||
// for parenthesized expression after alternative for anonymous function.
|
||||
@Benchmark
|
||||
public void run() {
|
||||
new Parser()
|
||||
.parseModule(
|
||||
"a1 {\n"
|
||||
+ " a2 {\n"
|
||||
+ " a3 {\n"
|
||||
+ " a4 {\n"
|
||||
+ " a5 {\n"
|
||||
+ " a6 {\n"
|
||||
+ " a7 {\n"
|
||||
+ " a8 {\n"
|
||||
+ " a9 {\n"
|
||||
+ " a10 {\n"
|
||||
+ " a11 {\n"
|
||||
+ " a12 {\n"
|
||||
+ " a13 = map(map(map((x) -> 1)))\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ " }\n"
|
||||
+ "}");
|
||||
public void parseStdlib() {
|
||||
for (var stdlibModule : Release.current().standardLibrary().modules()) {
|
||||
try {
|
||||
var moduleSource =
|
||||
IoUtils.readClassPathResourceAsString(
|
||||
getClass(), "/org/pkl/core/stdlib/%s.pkl".formatted(stdlibModule.substring(4)));
|
||||
new Parser().parseModule(moduleSource);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
public void parseSnippetTests() {
|
||||
var snippetTestDir =
|
||||
FileTestUtils.getRootProjectDir()
|
||||
.resolve("pkl-core/src/test/files/LanguageSnippetTests/input");
|
||||
for (var snippet : FileTestUtilsKt.listFilesRecursively(snippetTestDir)) {
|
||||
try {
|
||||
var moduleSource = Files.readString(snippet);
|
||||
new Parser().parseModule(moduleSource);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
} catch (ParserError ignore) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
/*
|
||||
* 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
|
||||
@file:Suppress("DSL_SCOPE_VIOLATION")
|
||||
@file:Suppress("DSL_SCOPE_VIOLATION")
|
||||
|
||||
import org.jetbrains.gradle.ext.ActionDelegationConfig
|
||||
import org.jetbrains.gradle.ext.ActionDelegationConfig.TestRunner.PLATFORM
|
||||
@@ -40,15 +55,12 @@ idea {
|
||||
}
|
||||
}
|
||||
|
||||
val clean by tasks.registering(Delete::class) {
|
||||
delete(buildDir)
|
||||
}
|
||||
val clean by tasks.existing { delete(layout.buildDirectory) }
|
||||
|
||||
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}
|
||||
Java version : ${System.getProperty("java.version")}
|
||||
@@ -63,5 +75,7 @@ Git Commit ID : ${buildInfo.commitId}
|
||||
====
|
||||
"""
|
||||
|
||||
val formattedMessage = message.replace("\n====", "\n" + "=".repeat(message.lines().maxByOrNull { it.length }!!.length))
|
||||
val formattedMessage =
|
||||
message.replace("\n====", "\n" + "=".repeat(message.lines().maxByOrNull { it.length }!!.length))
|
||||
|
||||
logger.info(formattedMessage)
|
||||
|
||||
@@ -1,17 +1,50 @@
|
||||
/*
|
||||
* 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 {
|
||||
`kotlin-dsl`
|
||||
`jvm-toolchains`
|
||||
}
|
||||
|
||||
// Keep this in sync with the constants in `BuildInfo.kt` (those are not addressable here).
|
||||
val toolchainVersion = 21
|
||||
|
||||
dependencies {
|
||||
implementation(libs.downloadTaskPlugin)
|
||||
implementation(libs.spotlessPlugin)
|
||||
implementation(libs.kotlinPlugin) {
|
||||
exclude(module = "kotlin-android-extensions")
|
||||
}
|
||||
implementation(libs.kotlinPlugin) { exclude(module = "kotlin-android-extensions") }
|
||||
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 {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
sourceCompatibility = JavaVersion.toVersion(toolchainVersion)
|
||||
targetCompatibility = JavaVersion.toVersion(toolchainVersion)
|
||||
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(toolchainVersion)
|
||||
vendor = JvmVendorSpec.ADOPTIUM
|
||||
}
|
||||
}
|
||||
|
||||
kotlin {
|
||||
jvmToolchain(toolchainVersion)
|
||||
compilerOptions { jvmTarget = JvmTarget.fromTarget(toolchainVersion.toString()) }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,22 @@
|
||||
/*
|
||||
* 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")
|
||||
|
||||
rootProject.name = "buildSrc"
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
@@ -7,14 +24,12 @@ pluginManagement {
|
||||
}
|
||||
}
|
||||
|
||||
plugins { id("org.gradle.toolchains.foojay-resolver-convention") }
|
||||
|
||||
// makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional
|
||||
dependencyResolutionManagement {
|
||||
// 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 {
|
||||
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
|
||||
|
||||
@@ -1,81 +1,113 @@
|
||||
/*
|
||||
* 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.io.File
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.VersionCatalog
|
||||
import org.gradle.api.artifacts.VersionCatalogsExtension
|
||||
import org.gradle.api.artifacts.VersionConstraint
|
||||
import org.gradle.kotlin.dsl.getByType
|
||||
import org.gradle.api.attributes.Category
|
||||
import org.gradle.api.plugins.JvmTestSuitePlugin
|
||||
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
|
||||
// `project.extensions.getByType<BuildInfo>()` in precompiled script plugins
|
||||
open class BuildInfo(project: Project) {
|
||||
val self = this
|
||||
|
||||
inner class GraalVm {
|
||||
open class BuildInfo(private val project: Project) {
|
||||
inner class GraalVm(val arch: String) {
|
||||
val homeDir: String by lazy {
|
||||
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 isGraal22: Boolean by lazy {
|
||||
version.startsWith("22")
|
||||
}
|
||||
|
||||
val arch by lazy {
|
||||
if (os.isMacOsX && isGraal22) {
|
||||
"amd64"
|
||||
} else {
|
||||
self.arch
|
||||
}
|
||||
}
|
||||
val graalVmJdkVersion: String by lazy { libs.findVersion("graalVmJdkVersion").get().toString() }
|
||||
|
||||
val osName: String by lazy {
|
||||
when {
|
||||
os.isMacOsX && isGraal22 -> "darwin"
|
||||
os.isMacOsX -> "macos"
|
||||
os.isLinux -> "linux"
|
||||
os.isWindows -> "windows"
|
||||
else -> throw RuntimeException("${os.familyName} is not supported.")
|
||||
}
|
||||
}
|
||||
|
||||
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 baseName: String by lazy { "graalvm-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin" }
|
||||
|
||||
val downloadUrl: String by lazy {
|
||||
if (isGraal22) {
|
||||
"https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-" +
|
||||
"${version}/$baseName.tar.gz"
|
||||
} else {
|
||||
val jdkMajor = graalVM23JdkVersion.takeWhile { it != '.' }
|
||||
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.tar.gz"
|
||||
}
|
||||
val jdkMajor = graalVmJdkVersion.takeWhile { it != '.' }
|
||||
val extension = if (os.isWindows) "zip" else "tar.gz"
|
||||
"https://download.oracle.com/graalvm/$jdkMajor/archive/$baseName.$extension"
|
||||
}
|
||||
|
||||
val installDir: File by lazy {
|
||||
File(homeDir, baseName)
|
||||
val downloadFile: File by lazy {
|
||||
val extension = if (os.isWindows) "zip" else "tar.gz"
|
||||
File(homeDir, "${baseName}.$extension")
|
||||
}
|
||||
|
||||
val installDir: File by lazy { File(homeDir, baseName) }
|
||||
|
||||
val baseDir: String by lazy {
|
||||
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 {
|
||||
when (val arch = System.getProperty("os.arch")) {
|
||||
"x86" -> "i386"
|
||||
@@ -85,14 +117,231 @@ open class BuildInfo(project: Project) {
|
||||
}
|
||||
}
|
||||
|
||||
val graalVm: GraalVm = GraalVm()
|
||||
val graalVmAarch64: GraalVm = GraalVm("aarch64")
|
||||
|
||||
val isCiBuild: Boolean by lazy {
|
||||
System.getenv("CI") != null
|
||||
val graalVmAmd64: GraalVm = GraalVm("x64")
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
val isReleaseBuild: Boolean by lazy {
|
||||
java.lang.Boolean.getBoolean("releaseBuild")
|
||||
// JPMS exports for Truffle; needed on some versions of Java, and transitively within some JARs.
|
||||
private val jpmsExports =
|
||||
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 {
|
||||
// see "install musl" in .circleci/jobs/BuildNativeJob.pkl
|
||||
File(System.getProperty("user.home"), "staticdeps/bin/x86_64-linux-musl-gcc").exists()
|
||||
}
|
||||
|
||||
val os: org.gradle.internal.os.OperatingSystem by lazy {
|
||||
@@ -101,19 +350,25 @@ open class BuildInfo(project: Project) {
|
||||
|
||||
// could be `commitId: Provider<String> = project.provider { ... }`
|
||||
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
|
||||
if (project === project.rootProject) {
|
||||
Runtime.getRuntime()
|
||||
.exec("git rev-parse --short HEAD", arrayOf(), project.rootDir)
|
||||
.inputStream.reader().readText().trim()
|
||||
val process =
|
||||
ProcessBuilder()
|
||||
.command("git", "rev-parse", "--short", "HEAD")
|
||||
.directory(project.rootDir)
|
||||
.start()
|
||||
process.waitFor().also { exitCode ->
|
||||
if (exitCode == -1) throw RuntimeException(process.errorStream.reader().readText())
|
||||
}
|
||||
process.inputStream.reader().readText().trim()
|
||||
} else {
|
||||
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 {
|
||||
if (isReleaseBuild) {
|
||||
@@ -142,3 +397,7 @@ open class BuildInfo(project: Project) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Shape of a function which is applied to configure multi-JDK testing.
|
||||
private typealias MultiJdkTestConfigurator =
|
||||
Test.(Pair<JavaLanguageVersion, Provider<JavaLauncher>>) -> Unit
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* 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.file.RegularFileProperty
|
||||
import org.gradle.api.provider.ListProperty
|
||||
@@ -5,37 +20,47 @@ import org.gradle.api.tasks.Input
|
||||
import org.gradle.api.tasks.InputFile
|
||||
import org.gradle.api.tasks.OutputFile
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
import org.gradle.kotlin.dsl.listProperty
|
||||
|
||||
/**
|
||||
* Builds a self-contained Pkl CLI Jar that is directly executable on *nix
|
||||
* and executable with `java -jar` on Windows.
|
||||
* Builds a self-contained Pkl CLI Jar that is directly executable on Windows, macOS, and Linux.
|
||||
*
|
||||
* For direct execution, the `java` command must be on the PATH.
|
||||
*
|
||||
* https://skife.org/java/unix/2011/06/20/really_executable_jars.html
|
||||
* Technique borrowed from [Mill](https://mill-build.org/blog/5-executable-jars.html).
|
||||
*/
|
||||
open class ExecutableJar : DefaultTask() {
|
||||
@get:InputFile
|
||||
val inJar: RegularFileProperty = project.objects.fileProperty()
|
||||
abstract class ExecutableJar : DefaultTask() {
|
||||
@get:InputFile abstract val inJar: RegularFileProperty
|
||||
|
||||
@get:OutputFile
|
||||
val outJar: RegularFileProperty = project.objects.fileProperty()
|
||||
@get:OutputFile abstract val outJar: RegularFileProperty
|
||||
|
||||
@get:Input
|
||||
val jvmArgs: ListProperty<String> = project.objects.listProperty()
|
||||
@get:Input abstract val jvmArgs: ListProperty<String>
|
||||
|
||||
@TaskAction
|
||||
fun buildJar() {
|
||||
val inFile = inJar.get().asFile
|
||||
val outFile = outJar.get().asFile
|
||||
val escapedJvmArgs = jvmArgs.get().joinToString(separator = " ") { "\"$it\"" }
|
||||
|
||||
val startScript = """
|
||||
#!/bin/sh
|
||||
exec java $escapedJvmArgs -jar $0 "$@"
|
||||
""".trim().trimMargin() + "\n\n\n"
|
||||
|
||||
val unixStartScript =
|
||||
"""
|
||||
@ 2>/dev/null # 2>nul & echo off & goto BOF
|
||||
:
|
||||
exec java $escapedJvmArgs -jar "$0" "$@"
|
||||
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 ->
|
||||
startScript.byteInputStream().use { it.copyTo(outStream) }
|
||||
inFile.inputStream().use { it.copyTo(outStream) }
|
||||
|
||||
@@ -1,7 +1,22 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
open class GradlePluginTests {
|
||||
lateinit var minGradleVersion: GradleVersion
|
||||
lateinit var maxGradleVersion: GradleVersion
|
||||
var skippedGradleVersions: List<GradleVersion> = listOf()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,21 @@
|
||||
import java.net.URL
|
||||
import org.gradle.util.GradleVersion
|
||||
/*
|
||||
* 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
|
||||
|
||||
@Suppress("unused")
|
||||
class GradleVersionInfo(json: Map<String, Any>) {
|
||||
@@ -38,31 +53,36 @@ class GradleVersionInfo(json: Map<String, Any>) {
|
||||
val wrapperChecksumUrl: String by json
|
||||
|
||||
companion object {
|
||||
private fun fetchAll(): List<GradleVersionInfo> = fetchMultiple("https://services.gradle.org/versions/all")
|
||||
private fun fetchAll(): List<GradleVersionInfo> =
|
||||
fetchMultiple("https://services.gradle.org/versions/all")
|
||||
|
||||
fun fetchReleases(): List<GradleVersionInfo> = fetchAll().filter { it.isReleaseVersion }
|
||||
|
||||
fun fetchCurrent(): GradleVersionInfo = fetchSingle("https://services.gradle.org/versions/current")
|
||||
fun fetchCurrent(): GradleVersionInfo =
|
||||
fetchSingle("https://services.gradle.org/versions/current")
|
||||
|
||||
fun fetchRc(): GradleVersionInfo? = fetchSingleOrNull("https://services.gradle.org/versions/release-candidate")
|
||||
fun fetchRc(): GradleVersionInfo? =
|
||||
fetchSingleOrNull("https://services.gradle.org/versions/release-candidate")
|
||||
|
||||
fun fetchNightly(): GradleVersionInfo = fetchSingle("https://services.gradle.org/versions/nightly")
|
||||
fun fetchNightly(): GradleVersionInfo =
|
||||
fetchSingle("https://services.gradle.org/versions/nightly")
|
||||
|
||||
private fun fetchSingle(url: String): GradleVersionInfo {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return GradleVersionInfo(JsonSlurper().parse(URL(url)) as Map<String, Any>)
|
||||
return GradleVersionInfo(JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>)
|
||||
}
|
||||
|
||||
private fun fetchSingleOrNull(url: String): GradleVersionInfo? {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val json = JsonSlurper().parse(URL(url)) as Map<String, Any>
|
||||
val json = JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>
|
||||
return if (json.isEmpty()) null else GradleVersionInfo(json)
|
||||
}
|
||||
|
||||
private fun fetchMultiple(url: String): List<GradleVersionInfo> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return (JsonSlurper().parse(URL(url)) as List<Map<String, Any>>)
|
||||
.map { GradleVersionInfo(it) }
|
||||
return (JsonSlurper().parse(URI(url).toURL()) as List<Map<String, Any>>).map {
|
||||
GradleVersionInfo(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,21 @@
|
||||
/*
|
||||
* 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.file.FileCollection
|
||||
|
||||
open class HtmlValidator(project: Project) {
|
||||
var sources: FileCollection = project.files()
|
||||
}
|
||||
}
|
||||
|
||||
91
buildSrc/src/main/kotlin/InstallGraalVm.kt
Normal file
91
buildSrc/src/main/kotlin/InstallGraalVm.kt
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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
|
||||
}
|
||||
}
|
||||
}
|
||||
64
buildSrc/src/main/kotlin/JavaVersionRange.kt
Normal file
64
buildSrc/src/main/kotlin/JavaVersionRange.kt
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* 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()
|
||||
}
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* 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.util.regex.Matcher
|
||||
import java.util.regex.Pattern
|
||||
@@ -15,21 +30,18 @@ import org.gradle.kotlin.dsl.listProperty
|
||||
import org.gradle.kotlin.dsl.mapProperty
|
||||
|
||||
open class MergeSourcesJars : DefaultTask() {
|
||||
@get:InputFiles
|
||||
val inputJars: ConfigurableFileCollection = project.objects.fileCollection()
|
||||
@get:InputFiles val inputJars: ConfigurableFileCollection = project.objects.fileCollection()
|
||||
|
||||
@get:InputFiles
|
||||
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
|
||||
var sourceFileExtensions: ListProperty<String> = project.objects.listProperty<String>()
|
||||
.convention(listOf(".java", ".kt"))
|
||||
var sourceFileExtensions: ListProperty<String> =
|
||||
project.objects.listProperty<String>().convention(listOf(".java", ".kt"))
|
||||
|
||||
@get:OutputFile
|
||||
val outputJar: RegularFileProperty = project.objects.fileProperty()
|
||||
@get:OutputFile val outputJar: RegularFileProperty = project.objects.fileProperty()
|
||||
|
||||
@TaskAction
|
||||
@Suppress("unused")
|
||||
@@ -38,12 +50,15 @@ open class MergeSourcesJars : DefaultTask() {
|
||||
|
||||
val relocatedPkgs = relocatedPackages.get()
|
||||
|
||||
val relocatedPaths = relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }
|
||||
val relocatedPaths =
|
||||
relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }
|
||||
|
||||
// use negative lookbehind to match any that don't precede with
|
||||
// a word or a period character. should catch most cases.
|
||||
val importPattern = Pattern.compile("(?<!(\\w|\\.))(" +
|
||||
relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")")
|
||||
val importPattern =
|
||||
Pattern.compile(
|
||||
"(?<!(\\w|\\.))(" + relocatedPkgs.keys.joinToString("|") { it.replace(".", "\\.") } + ")"
|
||||
)
|
||||
|
||||
val sourceFileExts = sourceFileExtensions.get()
|
||||
|
||||
@@ -96,7 +111,7 @@ open class MergeSourcesJars : DefaultTask() {
|
||||
relocatedPkgs: Map<String, String>,
|
||||
details: FileVisitDetails,
|
||||
sourceText: String,
|
||||
importPattern: Pattern
|
||||
importPattern: Pattern,
|
||||
): String {
|
||||
val matcher = importPattern.matcher(sourceText)
|
||||
val buffer = StringBuffer()
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* 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.artifacts.Configuration
|
||||
import org.gradle.api.artifacts.result.ResolvedArtifactResult
|
||||
@@ -12,27 +27,29 @@ import org.gradle.kotlin.dsl.property
|
||||
import org.gradle.language.base.artifact.SourcesArtifact
|
||||
|
||||
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
|
||||
@Suppress("UnstableApiUsage", "unused")
|
||||
fun resolve() {
|
||||
val componentIds = configuration.get().incoming.resolutionResult.allDependencies.map {
|
||||
(it as ResolvedDependencyResult).selected.id
|
||||
}
|
||||
val componentIds =
|
||||
configuration.get().incoming.resolutionResult.allDependencies.map {
|
||||
(it as ResolvedDependencyResult).selected.id
|
||||
}
|
||||
|
||||
val resolutionResult = project.dependencies.createArtifactResolutionQuery()
|
||||
.forComponents(componentIds)
|
||||
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)
|
||||
.execute()
|
||||
val resolutionResult =
|
||||
project.dependencies
|
||||
.createArtifactResolutionQuery()
|
||||
.forComponents(componentIds)
|
||||
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)
|
||||
.execute()
|
||||
|
||||
val resolvedJars = resolutionResult.resolvedComponents
|
||||
.flatMap { it.getArtifacts(SourcesArtifact::class.java) }
|
||||
.map { (it as ResolvedArtifactResult).file }
|
||||
val resolvedJars =
|
||||
resolutionResult.resolvedComponents
|
||||
.flatMap { it.getArtifacts(SourcesArtifact::class.java) }
|
||||
.map { (it as ResolvedArtifactResult).file }
|
||||
|
||||
// copying to an output dir because I don't know how else to describe task outputs
|
||||
project.sync {
|
||||
|
||||
@@ -1,10 +1,28 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
plugins { id("com.diffplug.spotless") }
|
||||
|
||||
val buildInfo = extensions.create<BuildInfo>("buildInfo", project)
|
||||
|
||||
dependencyLocking {
|
||||
lockAllConfigurations()
|
||||
}
|
||||
dependencyLocking { lockAllConfigurations() }
|
||||
|
||||
configurations {
|
||||
val rejectedVersionSuffix = Regex("-alpha|-beta|-eap|-m|-rc|-snapshot", RegexOption.IGNORE_CASE)
|
||||
@@ -13,8 +31,10 @@ configurations {
|
||||
componentSelection {
|
||||
all {
|
||||
if (rejectedVersionSuffix.containsMatchIn(candidate.version)) {
|
||||
reject("Rejected dependency $candidate " +
|
||||
"because it has a prelease version suffix matching `$rejectedVersionSuffix`.")
|
||||
reject(
|
||||
"Rejected dependency $candidate " +
|
||||
"because it has a prelease version suffix matching `$rejectedVersionSuffix`."
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,38 +42,36 @@ 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 {
|
||||
val java = project.extensions.getByType<JavaPluginExtension>()
|
||||
java.sourceCompatibility = JavaVersion.VERSION_11
|
||||
java.targetCompatibility = JavaVersion.VERSION_11
|
||||
java.sourceCompatibility = JavaVersion.VERSION_17
|
||||
java.targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile>().configureEach {
|
||||
kotlinOptions {
|
||||
jvmTarget = "11"
|
||||
freeCompilerArgs = freeCompilerArgs + listOf("-Xjsr305=strict", "-Xjvm-default=all")
|
||||
compilerOptions {
|
||||
jvmTarget = JvmTarget.JVM_17
|
||||
freeCompilerArgs.addAll("-Xjsr305=strict", "-Xjvm-default=all")
|
||||
}
|
||||
}
|
||||
|
||||
plugins.withType(IdeaPlugin::class).configureEach {
|
||||
val errorMessage = "Use IntelliJ Gradle import instead of running the `idea` task. See README for more information."
|
||||
val errorMessage =
|
||||
"Use IntelliJ Gradle import instead of running the `idea` task. See README for more information."
|
||||
|
||||
tasks.named("idea") {
|
||||
doFirst {
|
||||
throw GradleException(errorMessage)
|
||||
}
|
||||
}
|
||||
tasks.named("ideaModule") {
|
||||
doFirst {
|
||||
throw GradleException(errorMessage)
|
||||
}
|
||||
}
|
||||
tasks.named("idea") { doFirst { throw GradleException(errorMessage) } }
|
||||
tasks.named("ideaModule") { doFirst { throw GradleException(errorMessage) } }
|
||||
if (project == rootProject) {
|
||||
tasks.named("ideaProject") {
|
||||
doFirst {
|
||||
throw GradleException(errorMessage)
|
||||
}
|
||||
}
|
||||
tasks.named("ideaProject") { doFirst { throw GradleException(errorMessage) } }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,11 +90,7 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
|
||||
// dependency versions in generated POMs
|
||||
publications {
|
||||
withType(MavenPublication::class.java) {
|
||||
versionMapping {
|
||||
allVariants {
|
||||
fromResolutionResult()
|
||||
}
|
||||
}
|
||||
versionMapping { allVariants { fromResolutionResult() } }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,12 +98,72 @@ plugins.withType(MavenPublishPlugin::class).configureEach {
|
||||
|
||||
// settings.gradle.kts sets `--write-locks`
|
||||
// if Gradle command line contains this task name
|
||||
val updateDependencyLocks by tasks.registering {
|
||||
doLast {
|
||||
configurations
|
||||
.filter { it.isCanBeResolved }
|
||||
.forEach { it.resolve() }
|
||||
val updateDependencyLocks by
|
||||
tasks.registering {
|
||||
doLast { configurations.filter { it.isCanBeResolved }.forEach { it.resolve() } }
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
val allDependencies by tasks.registering(DependencyReportTask::class)
|
||||
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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* 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.artifacts.Configuration
|
||||
import org.gradle.api.component.AdhocComponentWithVariants
|
||||
@@ -18,45 +33,58 @@ val fatJarConfiguration: Configuration = configurations.create("fatJar")
|
||||
val fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>("fatJar")
|
||||
|
||||
// ideally we'd configure this automatically based on project dependencies
|
||||
val firstPartySourcesJarsConfiguration: Configuration = configurations.create("firstPartySourcesJars")
|
||||
val firstPartySourcesJarsConfiguration: Configuration =
|
||||
configurations.create("firstPartySourcesJars")
|
||||
|
||||
val relocations = mapOf(
|
||||
// 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.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
|
||||
"org.msgpack." to "org.pkl.thirdparty.msgpack.",
|
||||
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom",
|
||||
"com.oracle.svm.core." to "org.pkl.thirdparty.svm.",
|
||||
val relocations =
|
||||
mapOf(
|
||||
// pkl-core dependencies
|
||||
"org.organicdesign.fp." to "org.pkl.thirdparty.paguro.",
|
||||
"org.snakeyaml.engine." to "org.pkl.thirdparty.snakeyaml.engine.",
|
||||
"org.msgpack." to "org.pkl.thirdparty.msgpack.",
|
||||
"org.w3c.dom." to "org.pkl.thirdparty.w3c.dom.",
|
||||
"com.oracle.svm.core." to "org.pkl.thirdparty.svm.",
|
||||
|
||||
// pkl-cli dependencies
|
||||
"org.jline." to "org.pkl.thirdparty.jline.",
|
||||
"com.github.ajalt.clikt." to "org.pkl.thirdparty.clikt.",
|
||||
"kotlin." to "org.pkl.thirdparty.kotlin.",
|
||||
"kotlinx." to "org.pkl.thirdparty.kotlinx.",
|
||||
"org.intellij." to "org.pkl.thirdparty.intellij.",
|
||||
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi",
|
||||
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni",
|
||||
// pkl-cli dependencies
|
||||
"org.jline." to "org.pkl.thirdparty.jline.",
|
||||
"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.",
|
||||
"kotlinx." to "org.pkl.thirdparty.kotlinx.",
|
||||
"org.intellij." to "org.pkl.thirdparty.intellij.",
|
||||
"org.fusesource.jansi." to "org.pkl.thirdparty.jansi.",
|
||||
"org.fusesource.hawtjni." to "org.pkl.thirdparty.hawtjni.",
|
||||
|
||||
// pkl-doc dependencies
|
||||
"org.commonmark." to "org.pkl.thirdparty.commonmark.",
|
||||
"org.jetbrains." to "org.pkl.thirdparty.jetbrains.",
|
||||
|
||||
// pkl-config-java dependencies
|
||||
"io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.",
|
||||
// pkl-doc dependencies
|
||||
"org.commonmark." to "org.pkl.thirdparty.commonmark.",
|
||||
"org.jetbrains." to "org.pkl.thirdparty.jetbrains.",
|
||||
|
||||
// pkl-codegen-java dependencies
|
||||
"com.squareup.javapoet." to "org.pkl.thirdparty.javapoet.",
|
||||
// pkl-config-java dependencies
|
||||
"io.leangen.geantyref." to "org.pkl.thirdparty.geantyref.",
|
||||
|
||||
// pkl-codegen-kotlin dependencies
|
||||
"com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.",
|
||||
)
|
||||
// pkl-codegen-java dependencies
|
||||
"com.palantir.javapoet." to "org.pkl.thirdparty.javapoet.",
|
||||
|
||||
val nonRelocations = listOf("com/oracle/truffle/")
|
||||
// pkl-codegen-kotlin dependencies
|
||||
"com.squareup.kotlinpoet." to "org.pkl.thirdparty.kotlinpoet.",
|
||||
)
|
||||
|
||||
for ((key, value) in relocations) {
|
||||
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 {
|
||||
inputs.property("relocations", relocations)
|
||||
@@ -65,9 +93,28 @@ tasks.shadowJar {
|
||||
|
||||
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/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
|
||||
exclude("META-INF/services/javax.annotation.processing.Processor")
|
||||
@@ -84,82 +131,81 @@ tasks.shadowJar {
|
||||
|
||||
// workaround for https://github.com/johnrengelman/shadow/issues/651
|
||||
components.withType(AdhocComponentWithVariants::class.java).forEach { c ->
|
||||
c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) {
|
||||
skip()
|
||||
c.withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) { skip() }
|
||||
}
|
||||
|
||||
val testFatJar by
|
||||
tasks.registering(Test::class) {
|
||||
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
||||
classpath =
|
||||
// compiled test classes
|
||||
sourceSets.test.get().output +
|
||||
// fat Jar
|
||||
tasks.shadowJar.get().outputs.files +
|
||||
// test-only dependencies
|
||||
// (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)
|
||||
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
||||
}
|
||||
}
|
||||
|
||||
val testFatJar by tasks.registering(Test::class) {
|
||||
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
||||
classpath =
|
||||
// compiled test classes
|
||||
sourceSets.test.get().output +
|
||||
// fat Jar
|
||||
tasks.shadowJar.get().outputs.files +
|
||||
// test-only dependencies
|
||||
// (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)
|
||||
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
||||
}
|
||||
tasks.check { dependsOn(testFatJar) }
|
||||
|
||||
tasks.check {
|
||||
dependsOn(testFatJar)
|
||||
}
|
||||
val validateFatJar by
|
||||
tasks.registering {
|
||||
val outputFile = layout.buildDirectory.file("validateFatJar/result.txt")
|
||||
inputs.files(tasks.shadowJar)
|
||||
inputs.property("nonRelocations", nonRelocations)
|
||||
outputs.file(outputFile)
|
||||
|
||||
val validateFatJar by tasks.registering {
|
||||
val outputFile = file("$buildDir/validateFatJar/result.txt")
|
||||
inputs.files(tasks.shadowJar)
|
||||
inputs.property("nonRelocations", nonRelocations)
|
||||
outputs.file(outputFile)
|
||||
|
||||
doLast {
|
||||
val unshadowedFiles = mutableListOf<String>()
|
||||
zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit {
|
||||
val fileDetails = this
|
||||
val path = fileDetails.relativePath.pathString
|
||||
if (!(fileDetails.isDirectory ||
|
||||
path.startsWith("org/pkl/") ||
|
||||
path.startsWith("META-INF/") ||
|
||||
nonRelocations.any { path.startsWith(it) })) {
|
||||
// don't throw exception inside `visit`
|
||||
// as this gives a misleading "Could not expand ZIP" error message
|
||||
unshadowedFiles.add(path)
|
||||
doLast {
|
||||
val unshadowedFiles = mutableListOf<String>()
|
||||
zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit {
|
||||
val fileDetails = this
|
||||
val path = fileDetails.relativePath.pathString
|
||||
if (
|
||||
!(fileDetails.isDirectory ||
|
||||
path.startsWith("org/pkl/") ||
|
||||
path.startsWith("META-INF/") ||
|
||||
nonRelocations.any { path.startsWith(it) })
|
||||
) {
|
||||
// don't throw exception inside `visit`
|
||||
// as this gives a misleading "Could not expand ZIP" error message
|
||||
unshadowedFiles.add(path)
|
||||
}
|
||||
}
|
||||
if (unshadowedFiles.isEmpty()) {
|
||||
outputFile.get().asFile.writeText("SUCCESS")
|
||||
} else {
|
||||
outputFile.get().asFile.writeText("FAILURE")
|
||||
throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n"))
|
||||
}
|
||||
}
|
||||
if (unshadowedFiles.isEmpty()) {
|
||||
outputFile.writeText("SUCCESS")
|
||||
} else {
|
||||
outputFile.writeText("FAILURE")
|
||||
throw GradleException("Found unshadowed files:\n" + unshadowedFiles.joinToString("\n"))
|
||||
}
|
||||
}
|
||||
}
|
||||
tasks.check {
|
||||
dependsOn(validateFatJar)
|
||||
}
|
||||
|
||||
val resolveSourcesJars by tasks.registering(ResolveSourcesJars::class) {
|
||||
configuration.set(configurations.runtimeClasspath)
|
||||
outputDir.set(project.file("$buildDir/resolveSourcesJars"))
|
||||
}
|
||||
tasks.check { dependsOn(validateFatJar) }
|
||||
|
||||
val fatSourcesJar by tasks.registering(MergeSourcesJars::class) {
|
||||
plugins.withId("pklJavaLibrary") {
|
||||
inputJars.from(tasks.named("sourcesJar"))
|
||||
val resolveSourcesJars by
|
||||
tasks.registering(ResolveSourcesJars::class) {
|
||||
configuration.set(configurations.runtimeClasspath)
|
||||
outputDir.set(layout.buildDirectory.dir("resolveSourcesJars"))
|
||||
}
|
||||
inputJars.from(firstPartySourcesJarsConfiguration)
|
||||
inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
|
||||
|
||||
mergedBinaryJars.from(tasks.shadowJar)
|
||||
relocatedPackages.set(relocations)
|
||||
outputJar.fileProvider(provider {
|
||||
file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(".jar", "-sources.jar"))
|
||||
})
|
||||
}
|
||||
val fatSourcesJar by
|
||||
tasks.registering(MergeSourcesJars::class) {
|
||||
plugins.withId("pklJavaLibrary") { inputJars.from(tasks.named("sourcesJar")) }
|
||||
inputJars.from(firstPartySourcesJarsConfiguration)
|
||||
inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })
|
||||
|
||||
artifacts {
|
||||
add("fatJar", tasks.shadowJar)
|
||||
}
|
||||
mergedBinaryJars.from(tasks.shadowJar)
|
||||
relocatedPackages.set(relocations)
|
||||
outputJar.fileProvider(
|
||||
provider {
|
||||
file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(".jar", "-sources.jar"))
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
artifacts { add("fatJar", tasks.shadowJar) }
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
@@ -167,16 +213,12 @@ publishing {
|
||||
project.shadow.component(this)
|
||||
|
||||
// sources Jar is fat
|
||||
artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) {
|
||||
classifier = "sources"
|
||||
}
|
||||
artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) { classifier = "sources" }
|
||||
|
||||
plugins.withId("pklJavaLibrary") {
|
||||
val javadocJar by tasks.existing(Jar::class)
|
||||
// Javadoc Jar is not fat (didn't invest effort)
|
||||
artifact(javadocJar.flatMap { it.archiveFile }) {
|
||||
classifier = "javadoc"
|
||||
}
|
||||
artifact(javadocJar.flatMap { it.archiveFile }) { classifier = "javadoc" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,85 +1,74 @@
|
||||
import java.nio.file.*
|
||||
import java.util.UUID
|
||||
/*
|
||||
* 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 de.undercouch.gradle.tasks.download.Download
|
||||
import de.undercouch.gradle.tasks.download.Verify
|
||||
|
||||
plugins {
|
||||
id("de.undercouch.download")
|
||||
}
|
||||
plugins { id("de.undercouch.download") }
|
||||
|
||||
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
|
||||
val downloadGraalVm by tasks.registering(Download::class) {
|
||||
onlyIf {
|
||||
!installDir.exists()
|
||||
}
|
||||
val downloadGraalVmAarch64 by
|
||||
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAarch64) }
|
||||
|
||||
src(downloadUrl)
|
||||
dest(downloadFile)
|
||||
val downloadGraalVmAmd64 by
|
||||
tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAmd64) }
|
||||
|
||||
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)
|
||||
tempAndMove(true)
|
||||
}
|
||||
|
||||
val verifyGraalVm by tasks.registering(Verify::class) {
|
||||
onlyIf {
|
||||
!installDir.exists()
|
||||
val verifyGraalVmAarch64 by
|
||||
tasks.registering(Verify::class) {
|
||||
configureVerifyGraalVm(buildInfo.graalVmAarch64)
|
||||
dependsOn(downloadGraalVmAarch64)
|
||||
}
|
||||
|
||||
dependsOn(downloadGraalVm)
|
||||
src(downloadFile)
|
||||
checksum(buildInfo.libs.findVersion("graalVmSha256-${buildInfo.graalVm.osName}-${buildInfo.graalVm.arch}").get().toString())
|
||||
val verifyGraalVmAmd64 by
|
||||
tasks.registering(Verify::class) {
|
||||
configureVerifyGraalVm(buildInfo.graalVmAmd64)
|
||||
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")
|
||||
}
|
||||
|
||||
// minimize chance of corruption by extract-to-random-dir-and-flip-symlink
|
||||
val installGraalVm by tasks.registering {
|
||||
dependsOn(verifyGraalVm)
|
||||
|
||||
onlyIf {
|
||||
!installDir.exists()
|
||||
@Suppress("unused")
|
||||
val installGraalVmAarch64 by
|
||||
tasks.registering(InstallGraalVm::class) {
|
||||
dependsOn(verifyGraalVmAarch64)
|
||||
graalVm = buildInfo.graalVmAarch64
|
||||
}
|
||||
|
||||
doLast {
|
||||
val distroDir = "$homeDir/${UUID.randomUUID()}"
|
||||
|
||||
try {
|
||||
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
|
||||
}
|
||||
@Suppress("unused")
|
||||
val installGraalVmAmd64 by
|
||||
tasks.registering(InstallGraalVm::class) {
|
||||
dependsOn(verifyGraalVmAmd64)
|
||||
graalVm = buildInfo.graalVmAmd64
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
/**
|
||||
* Allows to run Gradle plugin tests against different Gradle versions.
|
||||
/*
|
||||
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||
*
|
||||
* Adds a `compatibilityTestX` task for every Gradle version X
|
||||
* between `ext.minSupportedGradleVersion` and `ext.maxSupportedGradleVersion`
|
||||
* that is not in `ext.gradleVersionsExcludedFromTesting`.
|
||||
* The list of available Gradle versions is obtained from services.gradle.org.
|
||||
* 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.
|
||||
* They set system properties for the Gradle version and distribution URL to be used.
|
||||
* These properties are consumed by the `AbstractTest` class.
|
||||
* 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 {
|
||||
java
|
||||
}
|
||||
plugins { java }
|
||||
|
||||
val gradlePluginTests = extensions.create<GradlePluginTests>("gradlePluginTests")
|
||||
|
||||
@@ -24,18 +24,26 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
||||
when (val taskNameSuffix = matchResult.groupValues[1]) {
|
||||
"All" ->
|
||||
task("compatibilityTestAll") {
|
||||
dependsOn("compatibilityTestReleases", "compatibilityTestCandidate", "compatibilityTestNightly")
|
||||
dependsOn(
|
||||
"compatibilityTestReleases",
|
||||
"compatibilityTestCandidate",
|
||||
"compatibilityTestNightly",
|
||||
)
|
||||
}
|
||||
// releases in configured range
|
||||
"Releases" ->
|
||||
task("compatibilityTestReleases") {
|
||||
val versionInfos = GradleVersionInfo.fetchReleases()
|
||||
val versionsToTestAgainst = versionInfos.filter { versionInfo ->
|
||||
val v = versionInfo.gradleVersion
|
||||
!versionInfo.broken &&
|
||||
v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion &&
|
||||
v !in gradlePluginTests.skippedGradleVersions
|
||||
}
|
||||
val allVersions =
|
||||
versionInfos
|
||||
.filter { versionInfo ->
|
||||
val v = versionInfo.gradleVersion
|
||||
!versionInfo.broken &&
|
||||
v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion &&
|
||||
v !in gradlePluginTests.skippedGradleVersions
|
||||
}
|
||||
.sortedBy { it.gradleVersion }
|
||||
val versionsToTestAgainst = listOf(allVersions.first(), allVersions.last())
|
||||
|
||||
dependsOn(versionsToTestAgainst.map { createCompatibilityTestTask(it) })
|
||||
}
|
||||
@@ -45,8 +53,10 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
||||
val versionInfo = GradleVersionInfo.fetchCurrent()
|
||||
if (versionInfo.version == gradle.gradleVersion) {
|
||||
doLast {
|
||||
println("No new Gradle release available. " +
|
||||
"(Run `gradlew test` to test against ${versionInfo.version}.)")
|
||||
println(
|
||||
"No new Gradle release available. " +
|
||||
"(Run `gradlew test` to test against ${versionInfo.version}.)"
|
||||
)
|
||||
}
|
||||
} else {
|
||||
dependsOn(createCompatibilityTestTask(versionInfo))
|
||||
@@ -59,9 +69,7 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
||||
if (versionInfo?.activeRc == true) {
|
||||
dependsOn(createCompatibilityTestTask(versionInfo))
|
||||
} else {
|
||||
doLast {
|
||||
println("No active Gradle release candidate available.")
|
||||
}
|
||||
doLast { println("No active Gradle release candidate available.") }
|
||||
}
|
||||
}
|
||||
// latest nightly
|
||||
@@ -73,17 +81,17 @@ tasks.addRule("Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|
|
||||
// explicit version
|
||||
else ->
|
||||
createCompatibilityTestTask(
|
||||
taskNameSuffix,
|
||||
"https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip"
|
||||
taskNameSuffix,
|
||||
"https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun createCompatibilityTestTask(versionInfo: GradleVersionInfo): Task =
|
||||
createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl)
|
||||
fun createCompatibilityTestTask(versionInfo: GradleVersionInfo): TaskProvider<Test> =
|
||||
createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl)
|
||||
|
||||
fun createCompatibilityTestTask(version: String, downloadUrl: String): Task {
|
||||
return tasks.create("compatibilityTest$version", Test::class.java) {
|
||||
fun createCompatibilityTestTask(version: String, downloadUrl: String): TaskProvider<Test> {
|
||||
return tasks.register("compatibilityTest$version", Test::class.java) {
|
||||
mustRunAfter(tasks.test)
|
||||
|
||||
maxHeapSize = tasks.test.get().maxHeapSize
|
||||
|
||||
@@ -1,20 +1,33 @@
|
||||
plugins {
|
||||
base
|
||||
}
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
plugins { base }
|
||||
|
||||
val htmlValidator = extensions.create<HtmlValidator>("htmlValidator", project)
|
||||
|
||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||
|
||||
val validatorConfiguration: Configuration = configurations.create("validator") {
|
||||
resolutionStrategy.eachDependency {
|
||||
if (requested.group == "log4j" && requested.name == "log4j") {
|
||||
@Suppress("UnstableApiUsage")
|
||||
useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
|
||||
because("mitigate critical security vulnerabilities")
|
||||
val validatorConfiguration: Configuration =
|
||||
configurations.create("validator") {
|
||||
resolutionStrategy.eachDependency {
|
||||
if (requested.group == "log4j" && requested.name == "log4j") {
|
||||
@Suppress("UnstableApiUsage") useTarget(buildInfo.libs.findLibrary("log4j12Api").get())
|
||||
because("mitigate critical security vulnerabilities")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@Suppress("UnstableApiUsage")
|
||||
@@ -32,27 +45,29 @@ dependencies {
|
||||
}
|
||||
}
|
||||
|
||||
val validateHtml by tasks.registering(JavaExec::class) {
|
||||
val resultFile = file("$buildDir/validateHtml/result.txt")
|
||||
inputs.files(htmlValidator.sources)
|
||||
outputs.file(resultFile)
|
||||
val validateHtml by
|
||||
tasks.registering(JavaExec::class) {
|
||||
val resultFile = layout.buildDirectory.file("validateHtml/result.txt")
|
||||
inputs.files(htmlValidator.sources)
|
||||
outputs.file(resultFile)
|
||||
|
||||
classpath = validatorConfiguration
|
||||
mainClass.set("nu.validator.client.SimpleCommandLineValidator")
|
||||
args("--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 a “lang” attribute(.*)")
|
||||
args("--filterpattern", "(.*)unrecognized media “amzn-kf8”(.*)") // kindle
|
||||
// for debugging
|
||||
// args "--verbose"
|
||||
args(htmlValidator.sources)
|
||||
classpath = validatorConfiguration
|
||||
mainClass.set("nu.validator.client.SimpleCommandLineValidator")
|
||||
args(
|
||||
"--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 a “lang” attribute(.*)")
|
||||
args("--filterpattern", "(.*)unrecognized media “amzn-kf8”(.*)") // kindle
|
||||
// for debugging
|
||||
// args "--verbose"
|
||||
args(htmlValidator.sources)
|
||||
|
||||
// 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 not strictly necessary
|
||||
doFirst { project.delete(resultFile) }
|
||||
doLast { resultFile.writeText("Success.") }
|
||||
}
|
||||
// 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
|
||||
// not strictly necessary
|
||||
doFirst { project.delete(resultFile) }
|
||||
doLast { resultFile.get().asFile.writeText("Success.") }
|
||||
}
|
||||
|
||||
tasks.check {
|
||||
dependsOn(validateHtml)
|
||||
}
|
||||
tasks.check { dependsOn(validateHtml) }
|
||||
|
||||
@@ -1,17 +1,51 @@
|
||||
@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 {
|
||||
`java-library`
|
||||
`jvm-toolchains`
|
||||
id("pklKotlinTest")
|
||||
id("com.diffplug.spotless")
|
||||
}
|
||||
|
||||
// make sources Jar available to other subprojects
|
||||
val sourcesJarConfiguration = configurations.register("sourcesJar")
|
||||
val sourcesJarConfiguration: Provider<Configuration> = configurations.register("sourcesJar")
|
||||
|
||||
// Version Catalog library symbols.
|
||||
val libs = the<LibrariesForLibs>()
|
||||
|
||||
// Build configuration.
|
||||
val info = project.extensions.getByType<BuildInfo>()
|
||||
|
||||
java {
|
||||
val jvmTarget = JavaVersion.toVersion(info.jvmTarget)
|
||||
|
||||
withSourcesJar() // creates `sourcesJar` task
|
||||
withJavadocJar()
|
||||
|
||||
sourceCompatibility = jvmTarget
|
||||
targetCompatibility = jvmTarget
|
||||
|
||||
toolchain {
|
||||
languageVersion = info.jdkToolchainVersion
|
||||
vendor = info.jdkVendor
|
||||
}
|
||||
}
|
||||
|
||||
artifacts {
|
||||
@@ -21,19 +55,26 @@ artifacts {
|
||||
|
||||
spotless {
|
||||
java {
|
||||
googleJavaFormat("1.15.0")
|
||||
targetExclude("**/generated/**", "**/build/**")
|
||||
googleJavaFormat(libs.versions.googleJavaFormat.get())
|
||||
target("src/*/java/**/*.java")
|
||||
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"))
|
||||
}
|
||||
}
|
||||
|
||||
tasks.compileKotlin {
|
||||
enabled = false
|
||||
}
|
||||
tasks.compileKotlin { enabled = false }
|
||||
|
||||
tasks.jar {
|
||||
manifest {
|
||||
attributes += mapOf("Automatic-Module-Name" to "org.${project.name.replace("-", ".")}")
|
||||
attributes +=
|
||||
mapOf(
|
||||
"Automatic-Module-Name" to "org.${project.name.replace("-", ".")}",
|
||||
"Add-Exports" to info.jpmsExportsForJarManifest,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,16 +85,61 @@ tasks.javadoc {
|
||||
(options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet")
|
||||
}
|
||||
|
||||
val workAroundKotlinGradlePluginBug by tasks.registering {
|
||||
doLast {
|
||||
// Works around this problem, which sporadically appears and disappears in different subprojects:
|
||||
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type 'JavaCompile').
|
||||
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
|
||||
// specified for property 'compileKotlinOutputClasses' does not exist.
|
||||
file("$buildDir/classes/kotlin/main").mkdirs()
|
||||
val workAroundKotlinGradlePluginBug by
|
||||
tasks.registering {
|
||||
doLast {
|
||||
// Works around this problem, which sporadically appears and disappears in different
|
||||
// subprojects:
|
||||
// A problem was found with the configuration of task ':pkl-executor:compileJava' (type
|
||||
// 'JavaCompile').
|
||||
// > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'
|
||||
// specified for property 'compileKotlinOutputClasses' does not exist.
|
||||
layout.buildDirectory.dir("classes/kotlin/main").get().asFile.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 {
|
||||
javaCompiler = info.javaCompiler
|
||||
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,11 +1,33 @@
|
||||
/*
|
||||
* 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 {
|
||||
id("pklJavaLibrary")
|
||||
|
||||
kotlin("jvm")
|
||||
}
|
||||
|
||||
// Build configuration.
|
||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||
|
||||
// Version Catalog library symbols.
|
||||
val libs = the<LibrariesForLibs>()
|
||||
|
||||
dependencies {
|
||||
// At least some of our kotlin APIs contain Kotlin stdlib types
|
||||
// that aren't compiled away by kotlinc (e.g., `kotlin.Function`).
|
||||
@@ -19,10 +41,6 @@ tasks.compileKotlin {
|
||||
enabled = true // disabled by pklJavaLibrary
|
||||
}
|
||||
|
||||
spotless {
|
||||
kotlin {
|
||||
ktfmt("0.44").googleStyle()
|
||||
targetExclude("**/generated/**", "**/build/**")
|
||||
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
|
||||
}
|
||||
tasks.withType<KotlinJvmCompile>().configureEach {
|
||||
compilerOptions { jvmTarget = JvmTarget.fromTarget(buildInfo.jvmTarget.toString()) }
|
||||
}
|
||||
|
||||
@@ -1,7 +1,23 @@
|
||||
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
|
||||
/*
|
||||
* 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
|
||||
|
||||
plugins {
|
||||
`jvm-test-suite`
|
||||
kotlin("jvm")
|
||||
}
|
||||
|
||||
@@ -24,34 +40,36 @@ tasks.withType<Test>().configureEach {
|
||||
// enable checking of stdlib return types
|
||||
systemProperty("org.pkl.testMode", "true")
|
||||
|
||||
reports.named("html") {
|
||||
enabled = true
|
||||
}
|
||||
reports.named("html") { enabled = true }
|
||||
|
||||
testLogging {
|
||||
exceptionFormat = TestExceptionFormat.FULL
|
||||
}
|
||||
testLogging { exceptionFormat = TestExceptionFormat.FULL }
|
||||
|
||||
addTestListener(object : TestListener {
|
||||
override fun beforeSuite(suite: TestDescriptor) {}
|
||||
override fun beforeTest(testDescriptor: TestDescriptor) {}
|
||||
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}
|
||||
addTestListener(
|
||||
object : TestListener {
|
||||
override fun beforeSuite(suite: TestDescriptor) {}
|
||||
|
||||
// print report link at end of task, not just at end of build
|
||||
override fun afterSuite(descriptor: TestDescriptor, result: TestResult) {
|
||||
if (descriptor.parent != null) return // only interested in overall result
|
||||
override fun beforeTest(testDescriptor: TestDescriptor) {}
|
||||
|
||||
if (result.resultType == TestResult.ResultType.FAILURE) {
|
||||
println("\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}")
|
||||
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}
|
||||
|
||||
// print report link at end of task, not just at end of build
|
||||
override fun afterSuite(descriptor: TestDescriptor, result: TestResult) {
|
||||
if (descriptor.parent != null) return // only interested in overall result
|
||||
|
||||
if (result.resultType == TestResult.ResultType.FAILURE) {
|
||||
println(
|
||||
"\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// makes links clickable on macOS
|
||||
private fun fixFileUri(uri: URI): URI {
|
||||
if ("file" == uri.scheme && !uri.schemeSpecificPart.startsWith("//")) {
|
||||
return URI.create("file://" + uri.schemeSpecificPart)
|
||||
}
|
||||
return uri
|
||||
}
|
||||
}
|
||||
|
||||
// makes links clickable on macOS
|
||||
private fun fixFileUri(uri: URI): URI {
|
||||
if ("file" == uri.scheme && !uri.schemeSpecificPart.startsWith("//")) {
|
||||
return URI.create("file://" + uri.schemeSpecificPart)
|
||||
}
|
||||
return uri
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,22 @@
|
||||
/*
|
||||
* 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 checkNative by tasks.registering {}
|
||||
val testNative by tasks.registering {}
|
||||
|
||||
val buildNative by tasks.registering {
|
||||
dependsOn(assembleNative, checkNative)
|
||||
}
|
||||
val checkNative by tasks.registering { dependsOn(testNative) }
|
||||
|
||||
val buildNative by tasks.registering { dependsOn(assembleNative, checkNative) }
|
||||
|
||||
@@ -1,6 +1,21 @@
|
||||
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.util.Base64
|
||||
import org.gradle.api.publish.maven.tasks.GenerateMavenPom
|
||||
|
||||
plugins {
|
||||
`maven-publish`
|
||||
@@ -10,9 +25,7 @@ plugins {
|
||||
publishing {
|
||||
publications {
|
||||
components.findByName("java")?.let { javaComponent ->
|
||||
create<MavenPublication>("library") {
|
||||
from(javaComponent)
|
||||
}
|
||||
create<MavenPublication>("library") { from(javaComponent) }
|
||||
}
|
||||
withType<MavenPublication>().configureEach {
|
||||
pom {
|
||||
@@ -49,62 +62,78 @@ publishing {
|
||||
}
|
||||
}
|
||||
|
||||
val validatePom by tasks.registering {
|
||||
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
|
||||
val outputFile = file("$buildDir/validatePom") // dummy output to satisfy up-to-date check
|
||||
val validatePom by
|
||||
tasks.registering {
|
||||
if (tasks.findByName("generatePomFileForLibraryPublication") == null) {
|
||||
return@registering
|
||||
}
|
||||
val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)
|
||||
val outputFile =
|
||||
layout.buildDirectory.file("validatePom") // dummy output to satisfy up-to-date check
|
||||
|
||||
dependsOn(generatePomFileForLibraryPublication)
|
||||
inputs.file(generatePomFileForLibraryPublication.get().destination)
|
||||
outputs.file(outputFile)
|
||||
dependsOn(generatePomFileForLibraryPublication)
|
||||
inputs.file(generatePomFileForLibraryPublication.get().destination)
|
||||
outputs.file(outputFile)
|
||||
|
||||
doLast {
|
||||
outputFile.delete()
|
||||
doLast {
|
||||
outputFile.get().asFile.delete()
|
||||
|
||||
val pomFile = generatePomFileForLibraryPublication.get().destination
|
||||
assert(pomFile.exists())
|
||||
val pomFile = generatePomFileForLibraryPublication.get().destination
|
||||
assert(pomFile.exists())
|
||||
|
||||
val text = pomFile.readText()
|
||||
val text = pomFile.readText()
|
||||
|
||||
run {
|
||||
val unresolvedVersion = Regex("<version>.*[+,()\\[\\]].*</version>")
|
||||
val matches = unresolvedVersion.findAll(text).toList()
|
||||
if (matches.isNotEmpty()) {
|
||||
throw GradleException(
|
||||
"""
|
||||
run {
|
||||
val unresolvedVersion = Regex("<version>.*[+,()\\[\\]].*</version>")
|
||||
val matches = unresolvedVersion.findAll(text).toList()
|
||||
if (matches.isNotEmpty()) {
|
||||
throw GradleException(
|
||||
"""
|
||||
Found unresolved version selector(s) in generated POM:
|
||||
${matches.joinToString("\n") { it.groupValues[0] }}
|
||||
""".trimIndent()
|
||||
)
|
||||
"""
|
||||
.trimIndent()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||
if (buildInfo.isReleaseBuild) {
|
||||
val snapshotVersion = Regex("<version>.*-SNAPSHOT</version>")
|
||||
val matches = snapshotVersion.findAll(text).toList()
|
||||
if (matches.isNotEmpty()) {
|
||||
throw GradleException(
|
||||
"""
|
||||
val buildInfo = project.extensions.getByType<BuildInfo>()
|
||||
if (buildInfo.isReleaseBuild) {
|
||||
val snapshotVersion = Regex("<version>.*-SNAPSHOT</version>")
|
||||
val matches = snapshotVersion.findAll(text).toList()
|
||||
if (matches.isNotEmpty()) {
|
||||
throw GradleException(
|
||||
"""
|
||||
Found snapshot version(s) in generated POM of Pkl release version:
|
||||
${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 {
|
||||
// provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`
|
||||
// in CI.
|
||||
val signingKey = (findProperty("signingKey") as String?)
|
||||
?.let { Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII) }
|
||||
val signingKey =
|
||||
(findProperty("signingKey") as String?)?.let {
|
||||
Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)
|
||||
}
|
||||
val signingPassword = findProperty("signingPassword") as String?
|
||||
if (signingKey != null && signingPassword != null) {
|
||||
useInMemoryPgpKeys(signingKey, signingPassword)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||
// Copyright © $YEAR 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.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
||||
/*
|
||||
* Copyright © $YEAR 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.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
name: main
|
||||
title: Main Project
|
||||
version: 0.25.1
|
||||
version: 0.28.2
|
||||
prerelease: false
|
||||
nav:
|
||||
- nav.adoc
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
plugins {
|
||||
@@ -10,26 +25,25 @@ sourceSets {
|
||||
java {
|
||||
srcDir(file("modules/pkl-core/examples"))
|
||||
srcDir(file("modules/pkl-config-java/examples"))
|
||||
srcDir(file("modules/java-binding/examples"))
|
||||
}
|
||||
val kotlin = project.extensions
|
||||
.getByType<KotlinJvmProjectExtension>()
|
||||
.sourceSets[name]
|
||||
.kotlin
|
||||
kotlin.srcDir(file("modules/pkl-config-kotlin/examples"))
|
||||
val kotlin = project.extensions.getByType<KotlinJvmProjectExtension>().sourceSets[name].kotlin
|
||||
kotlin.srcDir(file("modules/kotlin-binding/examples"))
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation(project(":pkl-core"))
|
||||
testImplementation(project(":pkl-config-java"))
|
||||
testImplementation(project(":pkl-config-kotlin"))
|
||||
testImplementation(project(":pkl-commons-test"))
|
||||
testImplementation(projects.pklCore)
|
||||
testImplementation(projects.pklConfigJava)
|
||||
testImplementation(projects.pklConfigKotlin)
|
||||
testImplementation(projects.pklCommonsTest)
|
||||
testImplementation(libs.junitEngine)
|
||||
testImplementation(libs.antlrRuntime)
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
inputs.files(fileTree("modules").matching {
|
||||
include("**/pages/*.adoc")
|
||||
})
|
||||
inputs
|
||||
.files(fileTree("modules").matching { include("**/pages/*.adoc") })
|
||||
.withPropertyName("asciiDocFiles")
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
}
|
||||
|
||||
@@ -2,35 +2,45 @@
|
||||
# Manual edits can break the build and are not advised.
|
||||
# This file is expected to be part of source control.
|
||||
com.tunnelvisionlabs:antlr4-runtime:4.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
io.leangen.geantyref:geantyref:1.3.14=testRuntimeClasspath
|
||||
net.bytebuddy:byte-buddy:1.12.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
net.java.dev.jna:jna:5.6.0=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
io.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath
|
||||
net.bytebuddy:byte-buddy:1.15.11=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeOnlyDependenciesMetadata
|
||||
org.assertj:assertj-core:3.24.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.graalvm.sdk:graal-sdk:22.3.1=testRuntimeClasspath
|
||||
org.graalvm.truffle:truffle-api:22.3.1=testRuntimeClasspath
|
||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.10=kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.7.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-script-runtime:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains:annotations:13.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.junit.jupiter:junit-jupiter-api:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit.jupiter:junit-jupiter-engine:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit.jupiter:junit-jupiter-params:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.junit.platform:junit-platform-commons:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit.platform:junit-platform-engine:1.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.junit:junit-bom:5.9.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath,testRuntimeOnlyDependenciesMetadata
|
||||
org.assertj:assertj-core:3.27.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.graalvm.polyglot:polyglot:24.1.2=testRuntimeClasspath
|
||||
org.graalvm.sdk:collections:24.1.2=testRuntimeClasspath
|
||||
org.graalvm.sdk:graal-sdk:24.1.2=testRuntimeClasspath
|
||||
org.graalvm.sdk:nativeimage:24.1.2=testRuntimeClasspath
|
||||
org.graalvm.sdk:word:24.1.2=testRuntimeClasspath
|
||||
org.graalvm.truffle:truffle-api:24.1.2=testRuntimeClasspath
|
||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-build-common:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-build-tools-api:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-build-tools-impl:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-compiler-runner:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-daemon-client:2.0.21=kotlinBuildToolsApiClasspath
|
||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.0.21=kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration
|
||||
org.jetbrains.kotlin:kotlin-reflect:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-script-runtime:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinKlibCommonizerClasspath
|
||||
org.jetbrains.kotlin:kotlin-scripting-common:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-scripting-jvm:2.0.21=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
|
||||
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.snakeyaml:snakeyaml-engine:2.5=testRuntimeClasspath
|
||||
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
|
||||
org.snakeyaml:snakeyaml-engine:2.9=testRuntimeClasspath
|
||||
empty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,runtimeClasspath,runtimeOnlyDependenciesMetadata,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions
|
||||
|
||||
20
docs/modules/ROOT/pages/evolution-and-roadmap.adoc
Normal file
20
docs/modules/ROOT/pages/evolution-and-roadmap.adoc
Normal file
@@ -0,0 +1,20 @@
|
||||
= 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,7 +1,10 @@
|
||||
= User Manual
|
||||
include::../partials/component-attributes.adoc[]
|
||||
|
||||
Quick Links: xref:pkl-cli:index.adoc#installation[Installation] | xref:language-reference:index.adoc[Language Reference]
|
||||
Quick Links:
|
||||
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.
|
||||
It can be used from the command line, integrated in a build pipeline, or embedded in a program.
|
||||
|
||||
@@ -4,3 +4,6 @@
|
||||
* xref:kotlin-binding:index.adoc[Kotlin]
|
||||
* 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]
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// 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-no-suffix: 0.25.1
|
||||
:pkl-version-no-suffix: 0.28.2
|
||||
// tells whether pkl version corresponding to current git commit
|
||||
// is a release version (:is-release-version: '') or dev version (:!is-release-version:)
|
||||
:is-release-version: ''
|
||||
@@ -21,9 +21,14 @@ ifdef::is-release-version[]
|
||||
:pkl-artifact-version: {pkl-version}
|
||||
endif::[]
|
||||
|
||||
:uri-maven-docsite: https://central.sonatype.com/
|
||||
:uri-maven-docsite: https://central.sonatype.com
|
||||
|
||||
:uri-sonatype: https://s01.oss.sonatype.org/service/local/repositories/snapshots/content/
|
||||
:uri-sonatype: https://s01.oss.sonatype.org/content/groups/public
|
||||
|
||||
:uri-maven-repo: https://s01.oss.sonatype.org/content/groups/public
|
||||
ifdef::is-release-version[]
|
||||
:uri-maven-repo: https://repo1.maven.org/maven2
|
||||
endif::[]
|
||||
|
||||
:symbolic-version-name: latest
|
||||
ifdef::is-release-version[]
|
||||
@@ -34,10 +39,9 @@ endif::[]
|
||||
:uri-pkl-stdlib-docs: {uri-pkl-stdlib-docs-base}/{pkl-version}
|
||||
:uri-pkl-stdlib-docs-index: {uri-pkl-stdlib-docs}/
|
||||
|
||||
// TODO(oss): check these links when we have tags
|
||||
:github-branch: main
|
||||
ifdef::is-release-version[]
|
||||
:github-branch: v{pkl-version-no-suffix}
|
||||
:github-branch: {pkl-version-no-suffix}
|
||||
endif::[]
|
||||
:uri-github-tree: https://github.com/apple/pkl/tree/{github-branch}
|
||||
:uri-pkl-stdlib-sources: {uri-github-tree}/stdlib
|
||||
@@ -62,3 +66,82 @@ endif::[]
|
||||
:uri-config-java-example: {uri-pkl-examples-tree}/config-java
|
||||
:uri-config-kotlin-example: {uri-pkl-examples-tree}/config-kotlin
|
||||
: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
|
||||
|
||||
197
docs/modules/bindings-specification/pages/binary-encoding.adoc
Normal file
197
docs/modules/bindings-specification/pages/binary-encoding.adoc
Normal file
@@ -0,0 +1,197 @@
|
||||
= 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
|
||||
|===
|
||||
|
||||
173
docs/modules/bindings-specification/pages/index.adoc
Normal file
173
docs/modules/bindings-specification/pages/index.adoc
Normal file
@@ -0,0 +1,173 @@
|
||||
= 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.
|
||||
|
||||
@@ -0,0 +1,692 @@
|
||||
= 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.
|
||||
----
|
||||
@@ -0,0 +1,9 @@
|
||||
: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]]
|
||||
== Pkl vs. Static Config Formats
|
||||
|
||||
Static configuration formats such as JSON, YAML, and XML work reasonably well for simple configuration needs.
|
||||
Static configuration formats such as JSON, YAML, TOML, and XML work reasonably well for simple configuration needs.
|
||||
However, they do have some shortcomings, including:
|
||||
|
||||
. 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)
|
||||
. 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)
|
||||
. They offer little or no schema-aware tooling. (JSON, YAML)
|
||||
. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML, TOML)
|
||||
. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, TOML, XML)
|
||||
. They do not offer standardized or widely available schema validators. (JSON, YAML, TOML)
|
||||
. They offer little or no schema-aware tooling. (JSON, YAML, TOML)
|
||||
|
||||
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.
|
||||
+
|
||||
We maintian the following libraries:
|
||||
We maintain the following libraries:
|
||||
+
|
||||
* 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.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import org.pkl.config.java.Config;
|
||||
import org.pkl.config.java.ConfigEvaluator;
|
||||
import org.pkl.config.java.JavaType;
|
||||
import org.pkl.core.ModuleSource;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -11,8 +12,8 @@ public class JavaConfigExample {
|
||||
// tag::usage[]
|
||||
Config config;
|
||||
try (var evaluator = ConfigEvaluator.preconfigured()) { // <1>
|
||||
config = evaluator.evaluateText(
|
||||
"pigeon { age = 5; diet = \"Seeds\" }"); // <2>
|
||||
config = evaluator.evaluate(
|
||||
ModuleSource.text("pigeon { age = 5; diet = new Listing { \"Seeds\" } }")); // <2>
|
||||
}
|
||||
var pigeon = config.get("pigeon"); // <3>
|
||||
var age = pigeon.get("age").as(int.class); // <4>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
= Java Code Generator
|
||||
include::ROOT:partial$component-attributes.adoc[]
|
||||
:uri-pkl-codgen-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-codegen-java
|
||||
:uri-pkl-codegen-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.
|
||||
|
||||
@@ -23,8 +23,8 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
|
||||
[[install-library]]
|
||||
=== Java Library
|
||||
|
||||
The `pkl-codegen-java` library is available {uri-pkl-codgen-java-maven-module}[from Maven Central].
|
||||
It requires Java 11 or higher.
|
||||
The `pkl-codegen-java` library is available {uri-pkl-codegen-java-maven-module}[from Maven Central].
|
||||
It requires Java 17 or higher.
|
||||
|
||||
ifndef::is-release-version[]
|
||||
NOTE: Snapshots are published to repository `{uri-sonatype}`.
|
||||
@@ -36,36 +36,42 @@ To use the library in a Gradle project, declare the following dependency:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile "org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
[source,kotlin,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
|
||||
implementation("org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}")
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
}
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,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::[]
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
@@ -82,7 +88,7 @@ To use the library in a Maven project, declare the following dependency:
|
||||
<artifactId>pkl-codegen-java</artifactId>
|
||||
<version>{pkl-artifact-version}</version>
|
||||
</dependency>
|
||||
ifndef::is-release-build[]
|
||||
ifndef::is-release-version[]
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sonatype-s01</id>
|
||||
@@ -139,30 +145,27 @@ Flag that indicates to generate private final fields and public getter methods i
|
||||
[%collapsible]
|
||||
====
|
||||
Default: (flag not set) +
|
||||
Flag that indicates to generate Javadoc based on doc comments for Pkl modules, classes, and properties.
|
||||
Flag that indicates to preserve Pkl doc comments by generating corresponding Javadoc comments.
|
||||
====
|
||||
|
||||
.--params-annotation
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `org.pkl.config.java.mapper.Named` +
|
||||
Fully qualified name of the annotation to use on constructor parameters.
|
||||
Default: `none` if `--generate-spring-boot` is set, `org.pkl.config.java.mapper.Named` otherwise +
|
||||
Fully qualified name of the annotation type to use for annotating constructor parameters with their name. +
|
||||
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
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `org.pkl.config.java.mapper.NonNull` +
|
||||
Fully qualified named of the annotation class to use for non-null types. +
|
||||
This annotation is required to have `java.lang.annotation.ElementType.TYPE_USE` as a `@Target`
|
||||
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`.
|
||||
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 generator options:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
= pkl-config-java Library
|
||||
include::ROOT:partial$component-attributes.adoc[]
|
||||
:uri-pkl-core-EvalException: {uri-pkl-core-main-sources}/EvalException.java
|
||||
:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java
|
||||
|
||||
:uri-pkl-config-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-config-java-all
|
||||
:uri-pkl-config-java-main-sources: {uri-github-tree}/pkl-config-java/src/main/java/org/pkl/config/java
|
||||
@@ -15,8 +15,7 @@ include::ROOT:partial$component-attributes.adoc[]
|
||||
:uri-pkl-config-java-ConverterFactories: {uri-pkl-config-java-main-sources}/mapper/ConverterFactories.java
|
||||
:uri-pkl-config-java-Converter: {uri-pkl-config-java-main-sources}/mapper/Converter.java
|
||||
:uri-pkl-config-java-ConverterFactory: {uri-pkl-config-java-main-sources}/mapper/ConverterFactory.java
|
||||
:uri-pkl-config-java-PObjectToObjectByCtorTestJava: {uri-pkl-config-java-test-sources}/mapper/PObjectToObjectByCtorTest.java
|
||||
:uri-pkl-config-java-PObjectToObjectByCtorTestPkl: {uri-pkl-config-java-test-resources}/mapper/PObjectToObjectByCtorTest.pkl
|
||||
:uri-pkl-config-java-PObjectToDataObjectTestJava: {uri-pkl-config-java-test-sources}/mapper/PObjectToDataObjectTest.java
|
||||
|
||||
The _pkl-config-java_ library builds upon xref:pkl-core:index.adoc[pkl-core].
|
||||
It offers a higher-level API specifically designed for consuming application runtime configuration.
|
||||
@@ -24,7 +23,7 @@ It offers a higher-level API specifically designed for consuming application run
|
||||
== Installation
|
||||
|
||||
The _pkl-config-java_ library is available {uri-pkl-config-java-maven-module}[from Maven Central].
|
||||
It requires Java 11 or higher.
|
||||
It requires Java 17 or higher.
|
||||
|
||||
=== Gradle
|
||||
|
||||
@@ -32,34 +31,42 @@ To use the library in a Gradle project, declare the following dependency:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile "org.pkl-lang:pkl-config-java:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
[source,kotlin,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
|
||||
implementation("org.pkl-lang:pkl-config-java:{pkl-artifact-version}")
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
implementation "org.pkl-lang:pkl-config-java:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifdef::is-release-version[]
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
@@ -80,7 +87,7 @@ To use the library in a Maven project, declare the following dependency:
|
||||
<artifactId>pkl-config-java</artifactId>
|
||||
<version>{pkl-artifact-version}</version>
|
||||
</dependency>
|
||||
ifndef::is-release-build[]
|
||||
ifndef::is-release-version[]
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sonatype-s01</id>
|
||||
@@ -100,7 +107,7 @@ Unlike `pkl-config-java`, `pkl-config-java__-all__` is a fat Jar with renamed th
|
||||
|
||||
The {uri-pkl-config-java-ConfigEvaluator}[`ConfigEvaluator`] class loads and evaluates Pkl modules.
|
||||
If evaluation succeeds, a {uri-pkl-config-java-Config}[`Config`] object is returned.
|
||||
Otherwise, an {uri-pkl-core-EvalException}[`EvalException`] with error details is thrown.
|
||||
Otherwise, a {uri-pkl-core-PklException}[`PklException`] with error details is thrown.
|
||||
|
||||
The returned `Config` object represents the root of the Pkl configuration tree.
|
||||
Intermediate and leaf nodes are also represented as `Config` objects.
|
||||
@@ -124,7 +131,7 @@ In this example, this is done with a try-with-resources statement.
|
||||
Note that objects returned by the evaluator remain valid after calling `close()`.
|
||||
<2> Evaluate the given text.
|
||||
Other `evaluate` methods read from files, URLs, and other sources.
|
||||
If evaluation fails, an {uri-pkl-core-EvalException}[`EvalException`] is thrown.
|
||||
If evaluation fails, an {uri-pkl-core-PklException}[`PklException`] is thrown.
|
||||
<3> Navigate from the config root to its `"pigeon"` child.
|
||||
<4> Navigate from `"pigeon"` to `"age"` and get the latter's value as an `int`.
|
||||
If conversion to the requested type fails, a `ConversionException` is thrown.
|
||||
@@ -136,7 +143,7 @@ A `ConfigEvaluator` caches module sources and evaluation results.
|
||||
To clear the cache, for example to evaluate the same module again, close the evaluator and create a new one.
|
||||
|
||||
For a ready-to-go example with full source code,
|
||||
see link:{uri-config-java-example}[config-java] in the _pkl/pkl-examples_ repository.
|
||||
see link:{uri-config-java-example}[config-java] in the _pkl-jvm-examples_ repository.
|
||||
|
||||
[[object-mapping]]
|
||||
=== Object Mapping
|
||||
@@ -182,7 +189,7 @@ They need to be provided in one of the following ways:
|
||||
|
||||
For a complete object mapping example, see:
|
||||
|
||||
* {uri-pkl-config-java-PObjectToObjectByCtorTestJava}[`PObjectToObjectByCtorTest.java`]
|
||||
* {uri-pkl-config-java-PObjectToDataObjectTestJava}[`PObjectToDataObjectTest.java`]
|
||||
|
||||
TIP: Together with xref:java-binding:codegen.adoc[code generation], object mapping provides a complete solution for consuming Pkl configuration as statically typed Java objects.
|
||||
Java code never drifts from the configuration structure defined in Pkl, and the entire configuration tree can be code-completed in Java IDEs.
|
||||
|
||||
@@ -21,3 +21,57 @@ Relative paths are resolved against the working directory.
|
||||
Default: (not set) +
|
||||
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,6 +3,7 @@
|
||||
import org.pkl.config.java.ConfigEvaluator
|
||||
import org.pkl.config.kotlin.forKotlin
|
||||
import org.pkl.config.kotlin.to
|
||||
import org.pkl.core.ModuleSource
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
// the pkl/pkl-examples repo has a similar example
|
||||
@@ -12,7 +13,7 @@ class KotlinConfigExample {
|
||||
// tag::usage[]
|
||||
val evaluator = ConfigEvaluator.preconfigured().forKotlin() // <1>
|
||||
val config = evaluator.use { // <2>
|
||||
it.evaluateText("""pigeon { age = 5; diet = "Seeds" }""")
|
||||
it.evaluate(ModuleSource.text("""pigeon { age = 5; diet = new Listing { "Seeds" } }"""))
|
||||
}
|
||||
val pigeon = config["pigeon"] // <3>
|
||||
val age = pigeon["age"].to<Int>() // <4>
|
||||
@@ -25,7 +26,7 @@ class KotlinConfigExample {
|
||||
// tag::nullable[]
|
||||
val evaluator = ConfigEvaluator.preconfigured().forKotlin()
|
||||
val config = evaluator.use {
|
||||
it.evaluateText("name = null") // <1>
|
||||
it.evaluate(ModuleSource.text("name = null")) // <1>
|
||||
}
|
||||
val name = config["name"].to<String?>() // <2>
|
||||
// end::nullable[]
|
||||
|
||||
@@ -19,7 +19,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin c
|
||||
=== Java Library
|
||||
|
||||
The `pkl-codegen-kotlin` library is available {uri-pkl-codegen-kotlin-maven-module}[from Maven Central].
|
||||
It requires Java 8 or higher and Kotlin 1.3 or higher.
|
||||
It requires Java 17 or higher and Kotlin 1.3 or higher.
|
||||
|
||||
==== Gradle
|
||||
|
||||
@@ -27,36 +27,42 @@ To use the library in a Gradle project, declare the following dependency:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
[source,kotlin,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
|
||||
implementation("org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}")
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
}
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,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::[]
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
@@ -103,7 +109,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>`
|
||||
|
||||
`<modules>`::
|
||||
The absolute or relative URIs of the modules to generate classe for.
|
||||
The absolute or relative URIs of the modules to generate classes for.
|
||||
Relative URIs are resolved against the working directory.
|
||||
|
||||
==== Options
|
||||
@@ -112,7 +118,7 @@ Relative URIs are resolved against the working directory.
|
||||
[%collapsible]
|
||||
====
|
||||
Default: (flag not set) +
|
||||
Flag that indicates to generate Kdoc based on doc comments for Pkl modules, classes, and properties.
|
||||
Flag that indicates to preserve Pkl doc comments by generating corresponding KDoc comments.
|
||||
====
|
||||
|
||||
Common code generator options:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
= pkl-config-kotlin Library
|
||||
include::ROOT:partial$component-attributes.adoc[]
|
||||
:uri-pkl-config-kotlin-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-config-kotlin
|
||||
:uri-pkl-config-kotlin-main-sources: {uri-github-tree}/pkl-config-kotlin/src/main/kotlin/org/pkl/kotlin
|
||||
:uri-pkl-config-kotlin-test-sources: {uri-github-tree}/pkl-config-kotlin/src/test/kotlin/org/pkl/kotlin
|
||||
:uri-pkl-config-kotlin-main-sources: {uri-github-tree}/pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin
|
||||
:uri-pkl-config-kotlin-test-sources: {uri-github-tree}/pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin
|
||||
:uri-pkl-config-kotlin-ConverterFactories: {uri-pkl-config-kotlin-main-sources}/ConverterFactories.kt
|
||||
:uri-pkl-config-kotlin-ConfigExtensions: {uri-pkl-config-kotlin-main-sources}/ConfigExtensions.kt
|
||||
|
||||
@@ -12,7 +12,7 @@ We recommend that Kotlin projects depend on this library instead of _pkl-config-
|
||||
== Installation
|
||||
|
||||
The _pkl-config-kotlin_ library is available {uri-pkl-config-kotlin-maven-module}[from Maven Central].
|
||||
It requires Java 11 or higher and Kotlin 1.5 or higher.
|
||||
It requires Java 17 or higher and Kotlin 1.5 or higher.
|
||||
|
||||
=== Gradle
|
||||
|
||||
@@ -20,36 +20,42 @@ To use the library in a Gradle project, declare the following dependency:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile "org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
[source,kotlin,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
|
||||
implementation("org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}")
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
}
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,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::[]
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
@@ -66,7 +72,7 @@ To use the library in a Maven project, declare the following dependency:
|
||||
<artifactId>pkl-config-kotlin</artifactId>
|
||||
<version>{pkl-artifact-version}</version>
|
||||
</dependency>
|
||||
ifndef::is-release-build[]
|
||||
ifndef::is-release-version[]
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sonatype-s01</id>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 124 KiB |
@@ -134,6 +134,7 @@ exampleObjectWithMixedElements {
|
||||
<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.
|
||||
|
||||
[[entries]]
|
||||
=== Entries
|
||||
|
||||
Objects can have one more kind of member; _entries_.
|
||||
|
||||
@@ -33,13 +33,13 @@ parrot = (bird) {
|
||||
----
|
||||
|
||||
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 `pigeon` 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 `bird` except `name` is `"Parrot"`, diet is `"Berries"` the `taxonomy.order` is `"Psittaciformes"`.
|
||||
When you run this, Pkl expands everything fully.
|
||||
|
||||
[source,{pkl}]
|
||||
----
|
||||
bird {
|
||||
name = "Common wood pigeon"
|
||||
name = "Pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
@@ -58,9 +58,12 @@ parrot {
|
||||
}
|
||||
----
|
||||
|
||||
[IMPORTANT]
|
||||
[NOTE]
|
||||
====
|
||||
_Amending_ does not allow us to _add_ properties to the (typed) object we are amending.
|
||||
So far, you have only worked with link:{uri-stdlib-Dynamic}[Dynamic] objects.
|
||||
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.
|
||||
There, you see that amending _never changes the type_ of the object.
|
||||
====
|
||||
@@ -72,22 +75,25 @@ Consider the following example.
|
||||
[source,{pkl}]
|
||||
.nestedAmends.pkl
|
||||
----
|
||||
woodPigeon {
|
||||
name = "Common wood pigeon"
|
||||
stockPigeon {
|
||||
name = "Stock pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
species = "Columba palumbus"
|
||||
}
|
||||
}
|
||||
|
||||
stockPigeon = (woodPigeon) {
|
||||
name = "Stock pigeon"
|
||||
taxonomy { // <1>
|
||||
kingdom = "Animalia"
|
||||
clade = "Columbimorphae"
|
||||
order = "Columbiformes"
|
||||
species = "Columba oenas"
|
||||
}
|
||||
}
|
||||
|
||||
dodo = (stockPigeon) { // <2>
|
||||
woodPigeon = (stockPigeon) {
|
||||
name = "Common wood pigeon"
|
||||
taxonomy { // <1>
|
||||
species = "Columba palumbus"
|
||||
}
|
||||
}
|
||||
|
||||
dodo = (woodPigeon) { // <2>
|
||||
name = "Dodo"
|
||||
extinct = true // <3>
|
||||
taxonomy {
|
||||
@@ -100,7 +106,7 @@ dodo = (stockPigeon) { // <2>
|
||||
<3> New fields can be added to objects when amending.
|
||||
|
||||
Notice how you only have to change `taxonomy.species`.
|
||||
In this example, `bird.taxonomy` has `kingdom`, `clade`, `order` and `species`.
|
||||
In this example, `stockPigeon.taxonomy` has `kingdom`, `clade`, `order` and `species`.
|
||||
You are amending `stockPigeon`, to define `woodPigeon`.
|
||||
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"` .
|
||||
@@ -108,27 +114,36 @@ This notation says that everything in `taxonomy` should be what it is in the obj
|
||||
For the input above, Pkl produces the following output.
|
||||
[source,{pkl}]
|
||||
----
|
||||
woodPigeon {
|
||||
name = "Common wood pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
species = "Columba palumbus"
|
||||
}
|
||||
}
|
||||
stockPigeon {
|
||||
name = "Stock pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
clade = "Columbimorphae"
|
||||
order = "Columbiformes"
|
||||
species = "Columba oenas"
|
||||
}
|
||||
}
|
||||
woodPigeon {
|
||||
name = "Common wood pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
clade = "Columbimorphae"
|
||||
order = "Columbiformes"
|
||||
species = "Columba palumbus"
|
||||
}
|
||||
}
|
||||
dodo {
|
||||
name = "Dodo"
|
||||
diet = "Seeds"
|
||||
extinct = true
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
clade = "Columbimorphae"
|
||||
order = "Columbiformes"
|
||||
species = "Raphus cucullatus"
|
||||
}
|
||||
extinct = true
|
||||
}
|
||||
----
|
||||
|
||||
@@ -198,7 +213,7 @@ adultBirdFoods {
|
||||
|
||||
A `.pkl` file describes a _module_.
|
||||
Modules are objects that can be referred to from other modules.
|
||||
Going back to the example above, you can write `parrot` as a separate module.
|
||||
Going back to the example above, you can write `pigeon` as a separate module.
|
||||
|
||||
[source,{pkl}]
|
||||
.pigeon.pkl
|
||||
@@ -206,6 +221,8 @@ Going back to the example above, you can write `parrot` as a separate module.
|
||||
name = "Common wood pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
clade = "Dinosauria"
|
||||
species = "Columba palumbus"
|
||||
}
|
||||
----
|
||||
@@ -220,12 +237,12 @@ import "pigeon.pkl" // <1>
|
||||
parrot = (pigeon) {
|
||||
name = "Great green macaw"
|
||||
diet = "Berries"
|
||||
species {
|
||||
taxonomy {
|
||||
species = "Ara ambiguus"
|
||||
}
|
||||
}
|
||||
----
|
||||
<1> Importing `foo.pkl` creates the object `foo`, so you can refer to `pigeon` in this code, like you did before.
|
||||
<1> Importing `pigeon.pkl` creates the object `pigeon`, 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.
|
||||
Looking at the result, however, you see a (possibly) unexpected difference.
|
||||
@@ -233,9 +250,11 @@ Looking at the result, however, you see a (possibly) unexpected difference.
|
||||
[source,{pkl}]
|
||||
----
|
||||
$ pkl eval /Users/me/tutorial/pigeon.pkl
|
||||
name = "Common wood pigeon""
|
||||
name = "Common wood pigeon"
|
||||
diet = "Seeds"
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
clade = "Dinosauria"
|
||||
species = "Columba palumbus"
|
||||
}
|
||||
|
||||
@@ -244,6 +263,8 @@ parrot {
|
||||
name = "Great green macaw"
|
||||
diet = "Berries"
|
||||
taxonomy {
|
||||
kingdom = "Animalia"
|
||||
clade = "Dinosauria"
|
||||
species = "Ara ambiguus"
|
||||
}
|
||||
}
|
||||
@@ -275,9 +296,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.
|
||||
|
||||
[source,{pkl}]
|
||||
.acmecicd.pkl
|
||||
.AcmeCICD.pkl
|
||||
----
|
||||
module acmecicd
|
||||
module AcmeCICD
|
||||
|
||||
class Pipeline {
|
||||
name: String(nameRequiresBranchName)?
|
||||
@@ -307,7 +328,7 @@ Next, add a time-out of one minute for your job.
|
||||
[source,{pkl}]
|
||||
.cicd.pkl
|
||||
----
|
||||
amends "acmecicd.pkl"
|
||||
amends "AcmeCICD.pkl"
|
||||
|
||||
timeout = 1
|
||||
----
|
||||
@@ -320,7 +341,7 @@ Value: 1 // <3>
|
||||
|
||||
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>
|
||||
^
|
||||
@@ -360,7 +381,7 @@ Start off by specifying the name of the pipeline and nothing else.
|
||||
[source,{pkl}]
|
||||
.cicd.pkl
|
||||
----
|
||||
amends "acmecicd.pkl"
|
||||
amends "AcmeCICD.pkl"
|
||||
|
||||
timeout = 3
|
||||
pipelines {
|
||||
@@ -372,7 +393,7 @@ pipelines {
|
||||
<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.
|
||||
When the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the object specified on the `...`.
|
||||
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).
|
||||
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.
|
||||
|
||||
@@ -394,7 +415,7 @@ 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"
|
||||
^^^^^
|
||||
@@ -415,7 +436,7 @@ The message is quite instructive, so you can fix the error by adding a `branchNa
|
||||
[source,{pkl}]
|
||||
.cicd.pkl
|
||||
----
|
||||
amends "acmecicd.pkl"
|
||||
amends "AcmeCICD.pkl"
|
||||
|
||||
timeout = 3
|
||||
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.
|
||||
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.
|
||||
|
||||
@@ -30,7 +30,7 @@ amountLearned: Float = 13.37
|
||||
|
||||
duration: Duration = 30.min
|
||||
|
||||
bandwidthRequirementPerSecond: DataSize = 50.mb
|
||||
bandwidthRequirementPerSecond: DataSize = 52.4288.mb
|
||||
----
|
||||
|
||||
In the above, you've explicitly annotated the code with type signatures.
|
||||
@@ -45,7 +45,7 @@ part = 3
|
||||
hasExercises = true
|
||||
amountLearned = 13.37
|
||||
duration = 30.min
|
||||
bandwidthRequirementPerSecond = 50.mb
|
||||
bandwidthRequirementPerSecond = 52.4288.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.
|
||||
@@ -146,7 +146,7 @@ pklTutorialPart1 {
|
||||
hasExercises = true
|
||||
amountLearned = 13.37
|
||||
duration = 30.min
|
||||
bandwidthRequirementPerSecond = 50.mb
|
||||
bandwidthRequirementPerSecond = 52.4288.mb
|
||||
}
|
||||
pklTutorialPart2 {
|
||||
name = "Filling out a Template"
|
||||
@@ -154,7 +154,7 @@ pklTutorialPart2 {
|
||||
hasExercises = true
|
||||
amountLearned = 13.37
|
||||
duration = 30.min
|
||||
bandwidthRequirementPerSecond = 50.mb
|
||||
bandwidthRequirementPerSecond = 52.4288.mb
|
||||
}
|
||||
pklTutorialPart3 {
|
||||
name = "Writing a Template"
|
||||
@@ -162,12 +162,12 @@ pklTutorialPart3 {
|
||||
hasExercises = true
|
||||
amountLearned = 13.37
|
||||
duration = 30.min
|
||||
bandwidthRequirementPerSecond = 50.mb
|
||||
bandwidthRequirementPerSecond = 52.4288.mb
|
||||
}
|
||||
|
||||
----
|
||||
|
||||
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorial.pkl`.
|
||||
Sadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorialPart3.pkl`.
|
||||
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).
|
||||
This is not very DRY.
|
||||
@@ -199,7 +199,7 @@ amountLearned: Float = 13.37 // <2>
|
||||
|
||||
duration: Duration = 30.min // <2>
|
||||
|
||||
bandwidthRequirementPerSecond: DataSize = 50.mb // <2>
|
||||
bandwidthRequirementPerSecond: DataSize = 52.4288.mb // <2>
|
||||
----
|
||||
<1> No default value given.
|
||||
<2> Default value given.
|
||||
@@ -239,7 +239,7 @@ part = 3
|
||||
hasExercises = true
|
||||
amountLearned = 13.37
|
||||
duration = 30.min
|
||||
bandwidthRequirementPerSecond = 50.mb
|
||||
bandwidthRequirementPerSecond = 52.4288.mb
|
||||
|
||||
----
|
||||
|
||||
@@ -256,13 +256,13 @@ By "precisely" we mean, that amending an object also can't "turn it into" an ins
|
||||
== A new 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 a template on Pkl Hub.
|
||||
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.
|
||||
Suppose you want to define what a live workshop for this tutorial looks like.
|
||||
Consider this example:
|
||||
|
||||
[source,{pkl}]
|
||||
.workshop2023.pkl
|
||||
.workshop2024.pkl
|
||||
----
|
||||
title = "Pkl: Configure your Systems in New Ways"
|
||||
interactive = true
|
||||
@@ -278,7 +278,7 @@ duration = 1.5.h
|
||||
|
||||
event {
|
||||
name = "Migrating Birds between hemispheres"
|
||||
year = 2023
|
||||
year = 2024
|
||||
}
|
||||
|
||||
instructors {
|
||||
@@ -288,11 +288,11 @@ instructors {
|
||||
|
||||
sessions {
|
||||
new {
|
||||
date = "8/14/2023"
|
||||
date = "2/1/2024"
|
||||
time = 30.min
|
||||
}
|
||||
new {
|
||||
date = "8/15/2023"
|
||||
date = "2/1/2024"
|
||||
time = 30.min
|
||||
}
|
||||
}
|
||||
@@ -304,17 +304,17 @@ assistants {
|
||||
|
||||
agenda {
|
||||
["beginners"] {
|
||||
title = "Basic Configuration"
|
||||
name = "Basic Configuration"
|
||||
part = 1
|
||||
duration = 45.min
|
||||
}
|
||||
["intermediates"] {
|
||||
title = "Filling out a Template"
|
||||
name = "Filling out a Template"
|
||||
part = 2
|
||||
duration = 45.min
|
||||
}
|
||||
["experts"] {
|
||||
title = "Writing a Template"
|
||||
name = "Writing a Template"
|
||||
part = 3
|
||||
duration = 45.min
|
||||
}
|
||||
|
||||
@@ -1,15 +1,32 @@
|
||||
= CLI
|
||||
include::ROOT:partial$component-attributes.adoc[]
|
||||
:uri-homebrew: https://brew.sh
|
||||
:uri-pkl-macos-download: {github-releases}/pkl-cli-macos-{pkl-artifact-version}.bin
|
||||
:uri-pkl-linux-amd64-download: {github-releases}/pkl-cli-linux-amd64-{pkl-artifact-version}.bin
|
||||
:uri-pkl-linux-aarch64-download: {github-releases}/pkl-cli-linux-aarch64-{pkl-artifact-version}.bin
|
||||
:uri-pkl-alpine-download: {github-releases}/pkl-cli-alpine-amd64-{pkl-artifact-version}.bin
|
||||
:uri-pkl-java-download: {github-releases}/pkl-cli-java-{pkl-artifact-version}.jar
|
||||
: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-sonatype-snapshot-download}&a=pkl-cli-macos-amd64&e=bin
|
||||
:uri-pkl-macos-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-aarch64&e=bin
|
||||
:uri-pkl-linux-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-amd64&e=bin
|
||||
:uri-pkl-linux-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-aarch64&e=bin
|
||||
:uri-pkl-alpine-download: {uri-sonatype-snapshot-download}&a=pkl-cli-alpine-linux-amd64&e=bin
|
||||
: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[]
|
||||
:uri-pkl-macos-amd64-download: {github-releases}/pkl-macos-amd64
|
||||
:uri-pkl-macos-aarch64-download: {github-releases}/pkl-macos-aarch64
|
||||
:uri-pkl-linux-amd64-download: {github-releases}/pkl-linux-amd64
|
||||
:uri-pkl-linux-aarch64-download: {github-releases}/pkl-linux-aarch64
|
||||
: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
|
||||
endif::[]
|
||||
|
||||
:uri-pkl-stdlib-docs-settings: {uri-pkl-stdlib-docs}/settings/
|
||||
: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-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.
|
||||
For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
|
||||
@@ -20,12 +37,13 @@ For interactive development, the CLI includes a Read-Eval-Print Loop (REPL).
|
||||
The CLI comes in multiple flavors:
|
||||
|
||||
* Native macOS executable for amd64 (tested on macOS 10.15)
|
||||
* Native Linux executable for amd64 (tested on Oracle Linux 8)
|
||||
* Native Linux executable for aarch64 (tested on Oracle Linux 8)
|
||||
* Native Linux executable for amd64
|
||||
* Native Linux executable for aarch64
|
||||
* Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8)
|
||||
* Java executable (tested with Java 8/11/14 on macOS and Oracle Linux)
|
||||
* Native Windows executable for amd64 (tested on Windows Server 2022)
|
||||
* Java executable (tested with Java 17/21 on macOS and Oracle Linux)
|
||||
|
||||
On macOS and Linux, we recommend using the native executables.
|
||||
On macOS, Linux, and Windows, we recommend using the native executables.
|
||||
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?
|
||||
@@ -36,38 +54,59 @@ 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.
|
||||
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.
|
||||
However, it requires a Java 17 (or higher) runtime on the system path, and has a noticeable startup delay.
|
||||
|
||||
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.
|
||||
|
||||
//TODO uncomment this after brew formula is merged and available
|
||||
// [[homebrew]]
|
||||
// === Homebrew
|
||||
//
|
||||
// Release versions can be installed with {uri-homebrew}[Homebrew].
|
||||
//
|
||||
// ifdef::is-release-version[]
|
||||
// To install Pkl, run:
|
||||
//
|
||||
// [source,shell]
|
||||
// ----
|
||||
// brew install pkl
|
||||
// ----
|
||||
//
|
||||
// To update Pkl, run:
|
||||
//
|
||||
// [source,shell]
|
||||
// ----
|
||||
// brew update
|
||||
// brew upgrade pkl # or just `brew upgrade`
|
||||
// ----
|
||||
// endif::[]
|
||||
//
|
||||
// ifndef::is-release-version[]
|
||||
// For instructions, switch to a release version of this page.
|
||||
// endif::[]
|
||||
[[homebrew]]
|
||||
=== Homebrew
|
||||
|
||||
On macOS and Linux, release versions can be installed with {uri-homebrew}[Homebrew].
|
||||
|
||||
ifdef::is-release-version[]
|
||||
To install Pkl, run:
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
brew install pkl
|
||||
----
|
||||
|
||||
To update Pkl, run:
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
brew update
|
||||
brew upgrade pkl # or just `brew upgrade`
|
||||
----
|
||||
endif::[]
|
||||
|
||||
ifndef::is-release-version[]
|
||||
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
|
||||
@@ -76,17 +115,29 @@ Development and release versions can be downloaded and installed manually.
|
||||
|
||||
=== macOS Executable
|
||||
|
||||
On aarch64:
|
||||
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
curl -o pkl {uri-pkl-macos-download}
|
||||
curl -L -o pkl '{uri-pkl-macos-aarch64-download}'
|
||||
chmod +x pkl
|
||||
./pkl --version
|
||||
----
|
||||
|
||||
On amd64:
|
||||
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
curl -L -o pkl '{uri-pkl-macos-amd64-download}'
|
||||
chmod +x pkl
|
||||
./pkl --version
|
||||
----
|
||||
|
||||
This should print something similar to:
|
||||
|
||||
[source,shell]
|
||||
[source]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
Pkl {pkl-version} (macOS, native)
|
||||
@@ -98,30 +149,29 @@ Pkl {pkl-version} (macOS, native)
|
||||
The Linux executable is dynamically linked against _glibc_ and _libstdc{plus}{plus}_ for the amd64 and aarch64 architectures.
|
||||
For a statically linked executable, see <<Alpine Linux Executable>>.
|
||||
|
||||
On amd64:
|
||||
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
# on amd64
|
||||
curl -o pkl {uri-pkl-linux-amd64-download}
|
||||
chmod +x pkl
|
||||
./pkl --version
|
||||
----
|
||||
|
||||
On aarch64:
|
||||
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
curl -o pkl {uri-pkl-linux-aarch64-download}
|
||||
curl -L -o pkl '{uri-pkl-linux-aarch64-download}'
|
||||
chmod +x pkl
|
||||
./pkl --version
|
||||
----
|
||||
|
||||
On amd64:
|
||||
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
curl -L -o pkl '{uri-pkl-linux-amd64-download}'
|
||||
chmod +x pkl
|
||||
./pkl --version
|
||||
----
|
||||
|
||||
This should print something similar to:
|
||||
|
||||
[source,shell]
|
||||
[source]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
Pkl {pkl-version} (Linux, native)
|
||||
@@ -136,14 +186,14 @@ For a dynamically linked executable, see <<Linux Executable>>.
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
curl -o pkl {uri-pkl-alpine-download}
|
||||
curl -L -o pkl '{uri-pkl-alpine-download}'
|
||||
chmod +x pkl
|
||||
./pkl --version
|
||||
----
|
||||
|
||||
This should print something similar to:
|
||||
|
||||
[source,shell]
|
||||
[source]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
Pkl {pkl-version} (Linux, native)
|
||||
@@ -151,24 +201,65 @@ Pkl {pkl-version} (Linux, native)
|
||||
|
||||
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
|
||||
|
||||
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]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
curl -o jpkl {uri-pkl-java-download}
|
||||
curl -L -o jpkl '{uri-pkl-java-download}'
|
||||
chmod +x jpkl
|
||||
./jpkl --version
|
||||
----
|
||||
|
||||
Windows::
|
||||
+
|
||||
[source,PowerShell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
Invoke-WebRequest '{uri-pkl-java-download}' -OutFile jpkl.bat
|
||||
.\jpkl --version
|
||||
----
|
||||
====
|
||||
|
||||
This should print something similar to:
|
||||
|
||||
[source,shell]
|
||||
[subs="+attributes"]
|
||||
----
|
||||
Pkl {pkl-version} (macOS 10.16, Java 11.0.9)
|
||||
Pkl {pkl-version} (macOS 14.2, Java 17.0.10)
|
||||
----
|
||||
|
||||
NOTE: The Java executable is named `jpkl`.
|
||||
|
||||
[[usage]]
|
||||
== Usage
|
||||
|
||||
@@ -319,7 +410,7 @@ The following command prints `Pigeon` to the console:
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
pkl -x metadata.name pigeon.pkl
|
||||
pkl eval -x metadata.species pigeon.pkl
|
||||
# => Pigeon
|
||||
----
|
||||
|
||||
@@ -333,7 +424,7 @@ metadata {
|
||||
}
|
||||
|
||||
output {
|
||||
text = metadata.name.toString()
|
||||
text = metadata.species.toString()
|
||||
}
|
||||
----
|
||||
====
|
||||
@@ -343,7 +434,7 @@ This command also takes <<common-options, common options>>.
|
||||
[[command-server]]
|
||||
=== `pkl server`
|
||||
|
||||
*Synopsys:* `pkl server`
|
||||
*Synopsis:* `pkl server`
|
||||
|
||||
Run as a server that communicates over standard input/output.
|
||||
|
||||
@@ -352,12 +443,16 @@ This option is used for embedding Pkl in an external client, such as xref:swift:
|
||||
[[command-test]]
|
||||
=== `pkl test`
|
||||
|
||||
*Synopsys:* `pkl test [<options>] [<modules>]`
|
||||
*Synopsis:* `pkl test [<options>] [<modules>]`
|
||||
|
||||
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.
|
||||
|
||||
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>::
|
||||
The absolute or relative URIs of the modules to test. Relative URIs are resolved against the working directory.
|
||||
|
||||
@@ -387,7 +482,7 @@ This command also takes <<common-options, common options>>.
|
||||
[[command-repl]]
|
||||
=== `pkl repl`
|
||||
|
||||
*Synopsys:* `pkl repl [<options>]`
|
||||
*Synopsis:* `pkl repl [<options>]`
|
||||
|
||||
Start a REPL session.
|
||||
|
||||
@@ -507,14 +602,64 @@ package already exists in the cache directory, this command is a no-op.
|
||||
|
||||
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
|
||||
|
||||
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-project-resolve>>, <<command-project-package>>, and <<command-download-package>> commands support the following 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:
|
||||
|
||||
include::../../pkl-cli/partials/cli-common-options.adoc[]
|
||||
|
||||
The <<command-eval>>, <<command-test>>, <<command-repl>>, and <<command-download-package>> commands also take the following options:
|
||||
The <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-download-package>>, and <<command-analyze-imports>> commands also take the following options:
|
||||
|
||||
include::../../pkl-cli/partials/cli-project-options.adoc[]
|
||||
|
||||
@@ -616,8 +761,6 @@ Type :help or :examples for more information.
|
||||
pkl>
|
||||
----
|
||||
|
||||
NOTE: The Java executable is named `jpkl`.
|
||||
|
||||
=== Loading Modules
|
||||
|
||||
To load <<config.pkl,`config.pkl`>> into the REPL, run:
|
||||
@@ -627,11 +770,11 @@ To load <<config.pkl,`config.pkl`>> into the REPL, run:
|
||||
pkl> :load config.pkl
|
||||
----
|
||||
|
||||
To evaluate the `bird.name` property, run:
|
||||
To evaluate the `bird.species` property, run:
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
pkl> bird.name
|
||||
pkl> bird.species
|
||||
"Pigeon"
|
||||
----
|
||||
|
||||
@@ -693,7 +836,7 @@ pkl> hello
|
||||
pkl> function double(n) = 2 * n
|
||||
pkl> double(5)
|
||||
10
|
||||
pkl> class Bird { name: String }
|
||||
pkl> class Bird { species: String }
|
||||
pkl> new Bird { species = "Pigeon" }
|
||||
{
|
||||
name = ?
|
||||
@@ -715,9 +858,9 @@ pkl> species
|
||||
pkl> species = "Barn"
|
||||
pkl> species
|
||||
"Barn"
|
||||
pkl> species += " Owl"
|
||||
pkl> species + " Owl"
|
||||
pkl> species
|
||||
"Barn owl"
|
||||
"Barn Owl"
|
||||
----
|
||||
|
||||
Due to Pkl's late binding semantics, redefining a member affects dependent members:
|
||||
@@ -725,9 +868,9 @@ Due to Pkl's late binding semantics, redefining a member affects dependent membe
|
||||
[source,shell]
|
||||
----
|
||||
pkl> name = "Barn"
|
||||
pkl> species = "$name Owl"
|
||||
pkl> species = "\(name) Owl"
|
||||
pkl> species
|
||||
"Barn owl"
|
||||
"Barn Owl"
|
||||
pkl> name = "Elf"
|
||||
pkl> species
|
||||
"Elf Owl"
|
||||
@@ -780,3 +923,48 @@ These certificates can be overridden via either of the two options:
|
||||
Both these options will *replace* the default CA certificates bundled with Pkl. +
|
||||
The CLI option takes precedence over the certificates in `~/.pkl/cacerts/`. +
|
||||
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,7 +7,6 @@ Comma-separated list of URI patterns that determine which modules can be loaded
|
||||
Patterns are matched against the beginning of module URIs.
|
||||
(File paths have been converted to `file:` URLs at this stage.)
|
||||
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]]
|
||||
@@ -20,6 +19,19 @@ Patterns are matched against the beginning of resource URIs.
|
||||
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
|
||||
[%collapsible]
|
||||
@@ -32,7 +44,7 @@ The cache directory for storing packages.
|
||||
.--no-cache
|
||||
[%collapsible]
|
||||
====
|
||||
Disable cacheing of packages.
|
||||
Disable caching of packages.
|
||||
====
|
||||
|
||||
.-e, --env-var
|
||||
@@ -122,3 +134,21 @@ 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].
|
||||
====
|
||||
|
||||
.--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].
|
||||
====
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
include::ROOT:partial$component-attributes.adoc[]
|
||||
:uri-pkl-core-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-core
|
||||
:uri-pkl-core-main-sources: {uri-github-tree}/pkl-core/src/main/java/org/pkl/core
|
||||
:uri-pkl-core-test-sources: {uri-github-tree}/pkl-core/src/test/java/org/pkl/core
|
||||
:uri-pkl-core-test-sources: {uri-github-tree}/pkl-core/src/test/kotlin/org/pkl/core
|
||||
:uri-pkl-core-Evaluator: {uri-pkl-core-main-sources}/Evaluator.java
|
||||
:uri-pkl-core-PModule: {uri-pkl-core-main-sources}/PModule.java
|
||||
:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java
|
||||
@@ -22,7 +22,7 @@ The library can also be used to embed Pkl in Java libraries and applications.
|
||||
== Installation
|
||||
|
||||
The _pkl-core_ library is available {uri-pkl-core-maven-module}[from Maven Central].
|
||||
It requires Java 11 or higher.
|
||||
It requires Java 17 or higher.
|
||||
|
||||
=== Gradle
|
||||
|
||||
@@ -30,36 +30,42 @@ To use the library in a Gradle project, declare the following dependency:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile "org.pkl-lang:pkl-core:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
[source,kotlin,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile("org.pkl-lang:pkl-core:{pkl-artifact-version}")
|
||||
implementation("org.pkl-lang:pkl-core:{pkl-artifact-version}")
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
}
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,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::[]
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
@@ -76,7 +82,7 @@ To use the library in a Maven project, declare the following dependency:
|
||||
<artifactId>pkl-core</artifactId>
|
||||
<version>{pkl-artifact-version}</version>
|
||||
</dependency>
|
||||
ifndef::is-release-build[]
|
||||
ifndef::is-release-version[]
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sonatype-s01</id>
|
||||
|
||||
@@ -74,7 +74,7 @@ See xref:pkl-gradle:index.adoc#installation[Installation] in the _Gradle Plugin_
|
||||
=== Java Library
|
||||
|
||||
The `pkl-doc` library is available {uri-pkl-doc-maven}[from Maven Central].
|
||||
It requires Java 11 or higher.
|
||||
It requires Java 17 or higher.
|
||||
|
||||
ifndef::is-release-version[]
|
||||
NOTE: Snapshots are published to repository `{uri-sonatype}`.
|
||||
@@ -86,36 +86,42 @@ To use the library in a Gradle project, declare the following dependency:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile "org.pkl-lang:pkl-doc:{pkl-artifact-version}"
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url "{uri-sonatype}" }
|
||||
}
|
||||
endif::[]
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
[source,kotlin,subs="+attributes"]
|
||||
----
|
||||
dependencies {
|
||||
compile("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
|
||||
implementation("org.pkl-lang:pkl-doc:{pkl-artifact-version}")
|
||||
}
|
||||
|
||||
ifndef::is-release-build[]
|
||||
repositories {
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
}
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,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::[]
|
||||
}
|
||||
----
|
||||
====
|
||||
|
||||
@@ -132,7 +138,7 @@ To use the library in a Maven project, declare the following dependency:
|
||||
<artifactId>pkl-doc</artifactId>
|
||||
<version>{pkl-artifact-version}</version>
|
||||
</dependency>
|
||||
ifndef::is-release-build[]
|
||||
ifndef::is-release-version[]
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sonatype-s01</id>
|
||||
@@ -156,7 +162,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.
|
||||
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]
|
||||
==== Generating documentation for modules directly
|
||||
@@ -226,10 +232,18 @@ Relative URIs are resolved against the working directory.
|
||||
[%collapsible]
|
||||
====
|
||||
Default: (none) +
|
||||
Example: `pkldoc`
|
||||
Example: `pkldoc` +
|
||||
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:
|
||||
|
||||
include::../../pkl-cli/partials/cli-common-options.adoc[]
|
||||
|
||||
@@ -21,7 +21,7 @@ That is, plugin version `x.y.z` uses Pkl version `x.y.z`.
|
||||
== Installation
|
||||
|
||||
The Gradle plugin is available {uri-pkl-gradle-maven-module}[from Maven Central].
|
||||
It requires Java 11 or higher and Gradle 6.8 or higher.
|
||||
It requires Java 17 or higher and Gradle 8.1 or higher.
|
||||
Earlier Gradle versions are not supported.
|
||||
|
||||
ifndef::is-release-version[]
|
||||
@@ -32,31 +32,6 @@ The plugin is applied as follows:
|
||||
|
||||
[tabs]
|
||||
====
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
plugins {
|
||||
id "org.pkl-lang" version "{pkl-artifact-version}"
|
||||
}
|
||||
----
|
||||
+
|
||||
.settings.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
pluginManagement {
|
||||
repositories {
|
||||
ifdef::is-release-build[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-build[]
|
||||
maven { url "{uri-sonatype}" }
|
||||
endif::[]
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
Kotlin::
|
||||
+
|
||||
.build.gradle.kts
|
||||
@@ -72,11 +47,36 @@ plugins {
|
||||
----
|
||||
pluginManagement {
|
||||
repositories {
|
||||
ifdef::is-release-build[]
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-build[]
|
||||
maven { url = uri("{uri-sonatype}") }
|
||||
ifndef::is-release-version[]
|
||||
maven(url = "{uri-sonatype}")
|
||||
endif::[]
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
Groovy::
|
||||
+
|
||||
.build.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
plugins {
|
||||
id "org.pkl-lang" version "{pkl-artifact-version}"
|
||||
}
|
||||
----
|
||||
+
|
||||
.settings.gradle
|
||||
[source,groovy,subs="+attributes"]
|
||||
----
|
||||
pluginManagement {
|
||||
repositories {
|
||||
ifdef::is-release-version[]
|
||||
mavenCentral()
|
||||
endif::[]
|
||||
ifndef::is-release-version[]
|
||||
maven { url "{uri-sonatype}" }
|
||||
endif::[]
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,6 @@ pkl {
|
||||
evaluators {
|
||||
evalPkl {
|
||||
sourceModules.add(file("module1.pkl"))
|
||||
transitiveModules.from file("module2.pkl")
|
||||
outputFile = layout.buildDirectory.file("module1.yaml")
|
||||
outputFormat = "yaml"
|
||||
}
|
||||
@@ -118,7 +117,6 @@ pkl {
|
||||
evaluators {
|
||||
register("evalPkl") {
|
||||
sourceModules.add(file("module1.pkl"))
|
||||
transitiveModules.from(file("module2.pkl"))
|
||||
outputFile.set(layout.buildDirectory.file("module1.yaml"))
|
||||
outputFormat.set("yaml")
|
||||
}
|
||||
@@ -127,9 +125,6 @@ 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.
|
||||
Hence the above evaluator can be run with:
|
||||
|
||||
@@ -378,14 +373,26 @@ Example: `generateGetters = true` +
|
||||
Whether to generate private final fields and public getter methods rather than public final fields.
|
||||
====
|
||||
|
||||
// TODO: fixme (paramsAnnotation, nonNullAnnotation)
|
||||
.preferJavaxInjectAnnotation: Boolean
|
||||
.paramsAnnotation: Property<String>
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `false` +
|
||||
Example: `preferJavaxInjectAnnotation = true` +
|
||||
Whether to annotate constructor parameters with `@javax.inject.Named` instead of `@org.pkl.config.java.mapper.Named`.
|
||||
If `true`, the generated code will have a compile dependency on `javax.inject:javax.inject:1`.
|
||||
Default: `null` if `generateSpringBootConfig` is `true`, `"org.pkl.config.java.mapper.Named"` otherwise+
|
||||
Example: `paramsAnnotation = "org.project.MyAnnotation"` +
|
||||
Fully qualified name of the annotation type to use for annotating constructor parameters with their name. +
|
||||
The specified annotation type must have a `value` parameter of type `String` or the generated code may not compile.
|
||||
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:
|
||||
@@ -448,8 +455,15 @@ see link:{uri-codegen-kotlin-example}[codegen-kotlin] in the _pkl/pkl-examples_
|
||||
|
||||
=== Configuration Options
|
||||
|
||||
// TODO: fixme (generateKdoc)
|
||||
(None)
|
||||
=== Configuration Options
|
||||
|
||||
.generateKdoc: Property<Boolean>
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `false` +
|
||||
Example: `generateKdoc = true` +
|
||||
Whether to preserve Pkl doc comments by generating corresponding KDoc comments.
|
||||
====
|
||||
|
||||
Common code generation properties:
|
||||
|
||||
@@ -520,6 +534,17 @@ Example: `outputDir = layout.projectDirectory.dir("pkl-docs")` +
|
||||
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:
|
||||
|
||||
include::../partials/gradle-modules-properties.adoc[]
|
||||
@@ -626,7 +651,7 @@ Default: `false` +
|
||||
Whether to ignore expected example files and generate them again.
|
||||
====
|
||||
|
||||
Common propeties:
|
||||
Common properties:
|
||||
|
||||
include::../partials/gradle-common-properties.adoc[]
|
||||
|
||||
@@ -688,6 +713,64 @@ Example: `projectDirectories.from(file("pkl-config/""))` +
|
||||
The project directories to create packages for.
|
||||
====
|
||||
|
||||
Common propeties:
|
||||
Common properties:
|
||||
|
||||
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,4 +36,61 @@ Example: `generateSpringBootConfig = true` +
|
||||
Whether to generate config classes for use with Spring Boot.
|
||||
====
|
||||
|
||||
// TODO: fixme (implementSerializable)
|
||||
.implementSerializable: Property<Boolean>
|
||||
[%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,7 +7,6 @@ URI patterns that determine which modules can be loaded and evaluated.
|
||||
Patterns are matched against the beginning of module URIs.
|
||||
(File paths have been converted to `file:` URLs at this stage.)
|
||||
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>
|
||||
@@ -68,11 +67,18 @@ The cache directory for storing packages.
|
||||
If `null`, defaults to `~/.pkl/cache`.
|
||||
====
|
||||
|
||||
.color: Property<Boolean>
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `false` +
|
||||
Format messages using ANSI color.
|
||||
====
|
||||
|
||||
.noCache: Property<Boolean>
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `false` +
|
||||
Disable cacheing of packages.
|
||||
Disable caching of packages.
|
||||
====
|
||||
|
||||
.modulePath: ConfigurableFileCollection
|
||||
@@ -83,3 +89,21 @@ Example: `modulePath.from files("dir1", "zip1.zip", "jar1.jar")` +
|
||||
The directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.
|
||||
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,11 +20,17 @@ This property accepts the following types to represent a module:
|
||||
.transitiveModules: ConfigurableFileCollection
|
||||
[%collapsible]
|
||||
====
|
||||
Default: `files()` (empty collection) +
|
||||
Default: [computed by pkl-gradle] +
|
||||
Example 1: `transitiveModules.from files("module1.pkl", "module2.pkl")` +
|
||||
Example 2: `+transitiveModules.from fileTree("config").include("**/*.pkl")+` +
|
||||
|
||||
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.
|
||||
Relative paths are resolved against the project directory.
|
||||
====
|
||||
|
||||
BIN
docs/modules/release-notes/images/error_sample.png
Normal file
BIN
docs/modules/release-notes/images/error_sample.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 70 KiB |
BIN
docs/modules/release-notes/images/pkl-cli-help-new.png
Normal file
BIN
docs/modules/release-notes/images/pkl-cli-help-new.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 119 KiB |
BIN
docs/modules/release-notes/images/test_sample.png
Normal file
BIN
docs/modules/release-notes/images/test_sample.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
523
docs/modules/release-notes/pages/0.26.adoc
Normal file
523
docs/modules/release-notes/pages/0.26.adoc
Normal file
@@ -0,0 +1,523 @@
|
||||
= 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
docs/modules/release-notes/pages/0.27.adoc
Normal file
542
docs/modules/release-notes/pages/0.27.adoc
Normal file
@@ -0,0 +1,542 @@
|
||||
= 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
docs/modules/release-notes/pages/0.28.adoc
Normal file
378
docs/modules/release-notes/pages/0.28.adoc
Normal file
@@ -0,0 +1,378 @@
|
||||
= 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,9 +1,206 @@
|
||||
= Changelog
|
||||
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]]
|
||||
== 0.25.2 (2024-02-08)
|
||||
|
||||
=== Fixes
|
||||
|
||||
* 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])
|
||||
* Fixes an issue where a PklBugException produces an incorrect URL to file issues (link:https://github.com/apple/pkl/pull/73[#73])
|
||||
|
||||
=== Miscellaneous
|
||||
|
||||
* Documentation fixes (link:https://github.com/apple/pkl/pull/21[#21], link:https://github.com/apple/pkl/pull/29[#29], link:https://github.com/apple/pkl/pull/41[#41], link:https://github.com/apple/pkl/pull/44[#44], link:https://github.com/apple/pkl/pull/51[#51], link:https://github.com/apple/pkl/pull/57[#57], link:https://github.com/apple/pkl/pull/60[#60], link:https://github.com/apple/pkl/pull/64[#64], link:https://github.com/apple/pkl/pull/68[#68], link:https://github.com/apple/pkl/pull/74[#74], link:https://github.com/apple/pkl/pull/77[#77], link:https://github.com/apple/pkl/pull/78[#78], link:https://github.com/apple/pkl/pull/82[#82], link:https://github.com/apple/pkl/pull/84[#84], link:https://github.com/apple/pkl/pull/86[#86], link:https://github.com/apple/pkl/pull/89[#89], link:https://github.com/apple/pkl/pull/91[#91], link:https://github.com/apple/pkl/pull/104[#104])
|
||||
* Build script improvements (https://github.com/apple/pkl/pull/53[#53], link:https://github.com/apple/pkl/pull/83[#83])
|
||||
|
||||
=== Contributors ❤️
|
||||
|
||||
Thank you to all the contributors for this release!
|
||||
|
||||
* link:https://github.com/uhooi[@uhooi]
|
||||
* link:https://github.com/mnin[@mnin]
|
||||
* link:https://github.com/TinkoLiu[@TinkoLiu]
|
||||
* link:https://github.com/shufanhao[@shufanhao]
|
||||
* link:https://github.com/pfeilbr[@pfeilbr]
|
||||
* link:https://github.com/KadoBOT[@KadoBOT]
|
||||
* link:https://github.com/KushalP[@KushalP]
|
||||
* link:https://github.com/translatenix[@translatenix]
|
||||
* link:https://github.com/Edward-Knight[@Edward-Knight]
|
||||
* link:https://github.com/jamesward[@jamesward]
|
||||
* link:https://github.com/shubhgng[@shubhgng]
|
||||
* link:https://github.com/hayashikun[@hayashikun]
|
||||
* link:https://github.com/lanzafame[@lanzafame]
|
||||
* link:https://github.com/igmrrf[@igmrrf]
|
||||
* link:https://github.com/kelvinelove[@kelvinelove]
|
||||
* link:https://github.com/lilyball[@lilyball]
|
||||
* link:https://github.com/maiph[@maiph]
|
||||
|
||||
[[release-0.25.1]]
|
||||
== 0.25.1 (2024-02-01)
|
||||
|
||||
=== Fixes
|
||||
|
||||
* Fixes an issue where pkl-tools fat jar is empty.
|
||||
|
||||
[[release-0.25.0]]
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
= 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:changelog.adoc[Changelog]
|
||||
|
||||
@@ -12,7 +12,7 @@ XXX
|
||||
|
||||
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].
|
||||
To get started, follow xref:pkl-cli:index.adoc#installation[Installation].#
|
||||
|
||||
@@ -254,7 +254,7 @@ myFoo1: Foo = new Foo { foo = "bar" } // <1>
|
||||
myFoo2 = new Foo { foo = "bar" } // <2>
|
||||
----
|
||||
<1> Unnecessary `new Foo { ... }`
|
||||
<2> Unless amending/extendinge a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`.
|
||||
<2> Unless amending/extending a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`.
|
||||
|
||||
== Comments
|
||||
|
||||
@@ -270,7 +270,7 @@ Add a single space after `///`.
|
||||
|
||||
[source%parsed,{pkl}]
|
||||
----
|
||||
/// The time alotted for eating lunch.
|
||||
/// The time allotted for eating lunch.
|
||||
///
|
||||
/// Note:
|
||||
/// * 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}]
|
||||
----
|
||||
/// Designates whether it is zebra party time.
|
||||
partyTime: Booleean // TODO: Add constraints here?
|
||||
partyTime: Boolean // TODO: Add constraints here?
|
||||
----
|
||||
|
||||
=== Block comments
|
||||
@@ -356,7 +356,7 @@ 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 delimimters (`+##"\#"##+`).
|
||||
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 (`+##"\#"##+`).
|
||||
|
||||
=== Interpolation
|
||||
|
||||
|
||||
@@ -1,19 +1,31 @@
|
||||
* 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:use-cases.adoc[Use Cases]
|
||||
** xref:introduction:concepts.adoc[Concepts]
|
||||
** 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:language-tutorial:index.adoc[Tutorial]
|
||||
** xref:language-reference:index.adoc[Language Reference]
|
||||
** 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:pkl-cli:index.adoc[CLI]
|
||||
@@ -24,21 +36,14 @@
|
||||
*** xref:vscode:ROOT:index.adoc[VSCode]
|
||||
*** 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:evolution-and-roadmap.adoc[Evolution and Roadmap]
|
||||
|
||||
* 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:changelog.adoc[Changelog]
|
||||
|
||||
|
||||
@@ -16,15 +16,15 @@ import org.pkl.core.Loggers
|
||||
import org.pkl.core.SecurityManagers
|
||||
import org.pkl.core.StackFrameTransformers
|
||||
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.ReplResponse
|
||||
import org.pkl.core.repl.ReplServer
|
||||
import org.pkl.core.resource.ResourceReaders
|
||||
import org.pkl.core.util.IoUtils
|
||||
import org.antlr.v4.runtime.ParserRuleContext
|
||||
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 java.nio.file.Files
|
||||
import kotlin.io.path.isDirectory
|
||||
import kotlin.io.path.isRegularFile
|
||||
@@ -37,10 +37,10 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
private val projectDir = rootProjectDir.resolve("docs")
|
||||
private val docsDir = projectDir.resolve("modules")
|
||||
|
||||
companion object {
|
||||
private companion object {
|
||||
val headingRegex = Regex("""(?u)^\s*(=++)\s*(.+)""")
|
||||
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 codeBlockDelimiterRegex = Regex("""(?u)^\s*----""")
|
||||
val graphicsRegex = Regex("\\[small]#.+#")
|
||||
@@ -78,6 +78,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
override fun createExecutionContext(request: ExecutionRequest): ExecutionContext {
|
||||
val replServer = ReplServer(
|
||||
SecurityManagers.defaultManager,
|
||||
HttpClient.dummyClient(),
|
||||
Loggers.stdErr(),
|
||||
listOf(
|
||||
ModuleKeyFactories.standardLibrary,
|
||||
@@ -94,7 +95,8 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
null,
|
||||
null,
|
||||
IoUtils.getCurrentWorkingDir(),
|
||||
StackFrameTransformers.defaultTransformer
|
||||
StackFrameTransformers.defaultTransformer,
|
||||
false,
|
||||
)
|
||||
return ExecutionContext(replServer)
|
||||
}
|
||||
@@ -147,6 +149,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
private fun parseAsciidoc(docDescriptor: Descriptor.Path, selectors: List<UniqueIdSelector>) {
|
||||
var line = ""
|
||||
var prevLine = ""
|
||||
@@ -299,7 +302,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
|
||||
override fun getType() = Type.TEST
|
||||
|
||||
private val parsed: ParserRuleContext by lazy {
|
||||
private val parsed: org.pkl.core.parser.syntax.Node by lazy {
|
||||
when (language) {
|
||||
"pkl" -> Parser().parseModule(code)
|
||||
"pkl-expr" -> Parser().parseExpressionInput(code)
|
||||
@@ -314,7 +317,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
if (expectError) {
|
||||
throw AssertionError("Expected a parse error, but got none.")
|
||||
}
|
||||
} catch (e: LexParseException) {
|
||||
} catch (e: ParserError) {
|
||||
if (!expectError) {
|
||||
throw AssertionError(e.message)
|
||||
}
|
||||
@@ -331,7 +334,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
)
|
||||
)
|
||||
|
||||
val properties = parsed.children.filterIsInstance<PklParser.ClassPropertyContext>()
|
||||
val properties = parsed.children()?.filterIsInstance<ClassProperty>() ?: emptyList()
|
||||
|
||||
val responses = mutableListOf<ReplResponse>()
|
||||
|
||||
@@ -340,7 +343,7 @@ class DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.Execu
|
||||
responses.addAll(context.replServer.handleRequest(
|
||||
ReplRequest.Eval(
|
||||
"snippet",
|
||||
prop.Identifier().text,
|
||||
prop.name.value,
|
||||
false,
|
||||
true
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# suppress inspection "UnusedProperty" for whole file
|
||||
|
||||
group=org.pkl-lang
|
||||
version=0.25.1
|
||||
version=0.28.2
|
||||
|
||||
# google-java-format requires jdk.compiler exports
|
||||
org.gradle.jvmargs= \
|
||||
-XX:+UseParallelGC \
|
||||
-Dfile.encoding=UTF-8 \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
|
||||
@@ -13,5 +14,7 @@ org.gradle.jvmargs= \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
|
||||
|
||||
org.gradle.parallel=true
|
||||
org.gradle.caching=true
|
||||
kotlin.stdlib.default.dependency=false
|
||||
kotlin.daemon.jvmargs=-XX:+UseParallelGC
|
||||
#org.gradle.workers.max=1
|
||||
|
||||
@@ -1,53 +1,59 @@
|
||||
# NOTE: keep in sync with buildSrc/src/main/kotlin/Versions.kt until the latter can be removed
|
||||
[versions] # ordered alphabetically
|
||||
antlr = "4.+"
|
||||
assertj = "3.+"
|
||||
checksumPlugin = "1.2.0"
|
||||
clikt = "3.5.1"
|
||||
assertj = "3.+"
|
||||
checksumPlugin = "1.4.0"
|
||||
clikt = "5.+"
|
||||
commonMark = "0.+"
|
||||
downloadTaskPlugin = "4.1.2"
|
||||
downloadTaskPlugin = "5.6.0"
|
||||
geantyref = "1.+"
|
||||
googleJavaFormat = "1.25.2"
|
||||
# must not use `+` because used in download URL
|
||||
graalVm = "22.3.1"
|
||||
# intentionally empty; replaced by patch file when building pkl-cli macos/aarch64
|
||||
graalVM23JdkVersion = "replace-me"
|
||||
# 23.1.x requires JDK 20+
|
||||
graalVm = "24.1.2"
|
||||
graalVmJdkVersion = "21.0.5"
|
||||
# slightly hacky but convenient place so we remember to update the checksum
|
||||
graalVmSha256-darwin-amd64 = "325afad5f1c4a07a458c95e7c444cff63514a6afa6f2655c12b4f494dccf2228"
|
||||
graalVmSha256-linux-amd64 = "55547725a8be3ceb0a1da29a84cd3e958ba398ce4470ac89a8ba1bdb6d9bddb8"
|
||||
graalVmSha256-linux-aarch64 = "b46a3f9c82ac70990a62282b1fbe4474e784d9ba453839a428f88e94d21f8abc"
|
||||
ideaExtPlugin = "1.1"
|
||||
javaPoet = "1.+"
|
||||
graalVmSha256-macos-x64 = "2d9b09e28bc1bb6ff219bf62eacc4626c7740b4f1829ede9ea4450f33e9c0826"
|
||||
graalVmSha256-macos-aarch64 = "cb68cb2c796f42f37a56fcd1385d8b86cca12e0b46c5618a5ed3ec7dd2260f6f"
|
||||
graalVmSha256-linux-x64 = "c1960d4f9d278458bde1cd15115ac2f0b3240cb427d51cfeceb79dab91a7f5c9"
|
||||
graalVmSha256-linux-aarch64 = "3ad68fbb2d13da528dfa0aea9e9345383245ec9c31094dce3905cefba9aac01e"
|
||||
graalVmSha256-windows-x64 = "d5784cbdc87f84b5cbd6c9d09c6f1d4611954f139fcfc795005c58dffd7f6b41"
|
||||
ideaExtPlugin = "1.1.9"
|
||||
javaPoet = "0.+"
|
||||
javaxInject = "1"
|
||||
jansi = "2.+"
|
||||
jimfs = "1.+"
|
||||
jansi = "2.+"
|
||||
jline = "3.+"
|
||||
# later versions don't work with native image
|
||||
# (at least not without additional configuration; tested with 3.25.1 and 3.27.1)
|
||||
jline = "3.23.0"
|
||||
jmh = "1.+"
|
||||
jmhPlugin = "0.6.6"
|
||||
jmhPlugin = "0.7.2"
|
||||
jsr305 = "3.+"
|
||||
junit = "5.+"
|
||||
kotlin = "1.7.10"
|
||||
kotlin = "2.0.21"
|
||||
# 1.7+ generates much more verbose code
|
||||
kotlinPoet = "1.6.+"
|
||||
kotlinxHtml = "0.+"
|
||||
kotlinxSerialization = "1.+"
|
||||
kotlinPoet = "1.6.+"
|
||||
kotlinxHtml = "0.11.0"
|
||||
kotlinxSerialization = "1.8.0"
|
||||
ktfmt = "0.53"
|
||||
# replaces nuValidator's log4j dependency
|
||||
# something related to log4j-1.2-api is apparently broken in 2.17.2
|
||||
log4j = "2.17.1"
|
||||
msgpack = "0.9.8"
|
||||
nexusPublishPlugin = "2.0.0"
|
||||
nuValidator = "20.+"
|
||||
paguro = "3.+"
|
||||
shadowPlugin = "7.1.0"
|
||||
shadowPlugin = "8.1.1"
|
||||
slf4j = "1.+"
|
||||
# Breaking change in snakeYaml 2.6 (removing DumpSettingsBuilder::setScalarResolver), so pin to 2.5
|
||||
snakeYaml = "2.5"
|
||||
spotlessPlugin = "6.11.0"
|
||||
msgpack = "0.9.0"
|
||||
nexusPublishPlugin = "1.3.0"
|
||||
snakeYaml = "2.+"
|
||||
spotlessPlugin = "6.25.0"
|
||||
wiremock = "3.+"
|
||||
|
||||
[libraries] # ordered alphabetically
|
||||
antlr = { group = "com.tunnelvisionlabs", name = "antlr4", version.ref = "antlr" }
|
||||
antlrRuntime = { group = "com.tunnelvisionlabs", name = "antlr4-runtime", version.ref = "antlr" }
|
||||
assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertj" }
|
||||
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" }
|
||||
commonMarkTables = { group = "org.commonmark", name = "commonmark-ext-gfm-tables", version.ref = "commonMark" }
|
||||
downloadTaskPlugin = { group = "de.undercouch", name = "gradle-download-task", version.ref = "downloadTaskPlugin" }
|
||||
@@ -55,10 +61,10 @@ geantyref = { group = "io.leangen.geantyref", name = "geantyref", version.ref =
|
||||
graalCompiler = { group = "org.graalvm.compiler", name = "compiler", version.ref = "graalVm" }
|
||||
graalSdk = { group = "org.graalvm.sdk", name = "graal-sdk", version.ref = "graalVm" }
|
||||
graalJs = { group = "org.graalvm.js", name = "js", version.ref = "graalVm" }
|
||||
javaPoet = { group = "com.squareup", name = "javapoet", version.ref = "javaPoet" }
|
||||
javaPoet = { group = "com.palantir.javapoet", name = "javapoet", version.ref = "javaPoet" }
|
||||
javaxInject = { group = "javax.inject", name = "javax.inject", version.ref = "javaxInject" }
|
||||
jimfs = { group = "com.google.jimfs", name = "jimfs", version.ref = "jimfs" }
|
||||
jansi = { group = "org.fusesource.jansi", name = "jansi", version.ref = "jansi" }
|
||||
jimfs = { group = "com.google.jimfs", name = "jimfs", version.ref = "jimfs" }
|
||||
jlineReader = { group = "org.jline", name = "jline-reader", version.ref = "jline" }
|
||||
jlineTerminal = { group = "org.jline", name = "jline-terminal", version.ref = "jline" }
|
||||
jlineTerminalJansi = { group = "org.jline", name = "jline-terminal-jansi", version.ref = "jline" }
|
||||
@@ -67,19 +73,20 @@ junitApi = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.re
|
||||
junitEngine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", 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" }
|
||||
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" }
|
||||
kotlinPoet = { group = "com.squareup", name = "kotlinpoet", version.ref = "kotlinPoet" }
|
||||
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" }
|
||||
kotlinxHtml = { group = "org.jetbrains.kotlinx", name = "kotlinx-html-jvm", version.ref = "kotlinxHtml" }
|
||||
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" }
|
||||
msgpack = { group = "org.msgpack", name = "msgpack-core", version.ref = "msgpack" }
|
||||
nuValidator = { group = "nu.validator", name = "validator", version.ref = "nuValidator" }
|
||||
# to be replaced with https://github.com/usethesource/capsule or https://github.com/lacuna/bifurcan
|
||||
paguro = { group = "org.organicdesign", name = "Paguro", version.ref = "paguro" }
|
||||
shadowPlugin = { group = "gradle.plugin.com.github.johnrengelman", name = "shadow", version.ref = "shadowPlugin" }
|
||||
pklConfigJavaAll025 = { group = "org.pkl-lang", name = "pkl-config-java-all", version = "0.25.0" }
|
||||
shadowPlugin = { group = "com.github.johnrengelman", name = "shadow", version.ref = "shadowPlugin" }
|
||||
slf4jApi = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" }
|
||||
slf4jSimple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
|
||||
snakeYaml = { group = "org.snakeyaml", name = "snakeyaml-engine", version.ref = "snakeYaml" }
|
||||
@@ -87,12 +94,14 @@ spotlessPlugin = { group = "com.diffplug.spotless", name = "spotless-plugin-grad
|
||||
svm = { group = "org.graalvm.nativeimage", name = "svm", 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" }
|
||||
msgpack = { group = "org.msgpack", name = "msgpack-core", version.ref = "msgpack" }
|
||||
truffleSvm = { group = "org.graalvm.nativeimage", name = "truffle-runtime-svm", version.ref = "graalVm" }
|
||||
truffleRuntime = { group = "org.graalvm.truffle", name = "truffle-runtime", version.ref = "graalVm" }
|
||||
wiremock = { group = "org.wiremock", name = "wiremock", version.ref = "wiremock" }
|
||||
|
||||
[plugins] # ordered alphabetically
|
||||
checksum = { id = "org.gradle.crypto.checksum", version.ref = "checksumPlugin" }
|
||||
ideaExt = { id = "org.jetbrains.gradle.plugin.idea-ext", version.ref = "ideaExtPlugin" }
|
||||
jmh = { id = "me.champeau.jmh", version.ref = "jmhPlugin" }
|
||||
kotlinxSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
|
||||
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadowPlugin" }
|
||||
nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexusPublishPlugin" }
|
||||
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadowPlugin" }
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
5
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,8 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
|
||||
distributionSha256Sum=8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
43
gradlew
vendored
43
gradlew
vendored
@@ -15,6 +15,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -55,7 +57,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -80,13 +82,11 @@ do
|
||||
esac
|
||||
done
|
||||
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
APP_NAME="Gradle"
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
|
||||
# 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"'
|
||||
# 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
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
@@ -133,22 +133,29 @@ location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
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
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
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 ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | 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" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@@ -193,11 +200,15 @@ if "$cygwin" || "$msys" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
# 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"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * 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 -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
@@ -205,6 +216,12 @@ set -- \
|
||||
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.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
|
||||
183
gradlew.bat
vendored
183
gradlew.bat
vendored
@@ -1,89 +1,94 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user