expressir 2.1.29 → 2.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +98 -0
  3. data/.github/workflows/links.yml +100 -0
  4. data/.github/workflows/rake.yml +4 -0
  5. data/.github/workflows/release.yml +5 -0
  6. data/.github/workflows/validate_schemas.yml +1 -1
  7. data/.gitignore +3 -0
  8. data/.rubocop.yml +1 -1
  9. data/.rubocop_todo.yml +209 -55
  10. data/Gemfile +2 -1
  11. data/README.adoc +650 -83
  12. data/docs/Gemfile +12 -0
  13. data/docs/_config.yml +141 -0
  14. data/docs/_guides/changes/changes-format.adoc +778 -0
  15. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  16. data/docs/_guides/changes/index.adoc +396 -0
  17. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  18. data/docs/_guides/changes/validating-changes.adoc +681 -0
  19. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  20. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  21. data/docs/_guides/cli/format-schemas.adoc +547 -0
  22. data/docs/_guides/cli/index.adoc +8 -0
  23. data/docs/_guides/cli/managing-changes.adoc +927 -0
  24. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  25. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  26. data/docs/_guides/index.adoc +165 -0
  27. data/docs/_guides/ler/creating-packages.adoc +664 -0
  28. data/docs/_guides/ler/index.adoc +305 -0
  29. data/docs/_guides/ler/loading-packages.adoc +707 -0
  30. data/docs/_guides/ler/package-formats.adoc +748 -0
  31. data/docs/_guides/ler/querying-packages.adoc +826 -0
  32. data/docs/_guides/ler/validating-packages.adoc +750 -0
  33. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  34. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  35. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  36. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  37. data/docs/_guides/liquid/index.adoc +468 -0
  38. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  39. data/docs/_guides/manifests/index.adoc +307 -0
  40. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  41. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  42. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  43. data/docs/_guides/ruby-api/index.adoc +257 -0
  44. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  45. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  46. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  47. data/docs/_pages/data-model.adoc +665 -0
  48. data/docs/_pages/express-language.adoc +506 -0
  49. data/docs/_pages/getting-started.adoc +414 -0
  50. data/docs/_pages/index.adoc +116 -0
  51. data/docs/_pages/introduction.adoc +256 -0
  52. data/docs/_pages/ler-packages.adoc +837 -0
  53. data/docs/_pages/parsers.adoc +683 -0
  54. data/docs/_pages/schema-manifests.adoc +431 -0
  55. data/docs/_references/index.adoc +228 -0
  56. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  57. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  58. data/docs/_tutorials/index.adoc +221 -0
  59. data/docs/_tutorials/liquid-templates.adoc +806 -0
  60. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  61. data/docs/_tutorials/querying-schemas.adoc +751 -0
  62. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  63. data/docs/index.adoc +242 -0
  64. data/docs/lychee.toml +84 -0
  65. data/examples/demo_ler_usage.sh +86 -0
  66. data/examples/ler/README.md +111 -0
  67. data/examples/ler/simple_example.ler +0 -0
  68. data/examples/ler/simple_schema.exp +33 -0
  69. data/examples/ler_build.rb +75 -0
  70. data/examples/ler_cli.rb +79 -0
  71. data/examples/ler_demo_complete.rb +276 -0
  72. data/examples/ler_query.rb +91 -0
  73. data/examples/ler_query_examples.rb +305 -0
  74. data/examples/ler_stats.rb +81 -0
  75. data/examples/phase3_demo.rb +159 -0
  76. data/examples/query_demo_simple.rb +131 -0
  77. data/expressir.gemspec +2 -0
  78. data/lib/expressir/changes/schema_change.rb +32 -22
  79. data/lib/expressir/changes/{edition_change.rb → version_change.rb} +3 -3
  80. data/lib/expressir/cli.rb +12 -4
  81. data/lib/expressir/commands/changes_import_eengine.rb +2 -2
  82. data/lib/expressir/commands/changes_validate.rb +1 -1
  83. data/lib/expressir/commands/manifest.rb +427 -0
  84. data/lib/expressir/commands/package.rb +1274 -0
  85. data/lib/expressir/commands/validate.rb +70 -37
  86. data/lib/expressir/commands/validate_ascii.rb +607 -0
  87. data/lib/expressir/commands/validate_load.rb +88 -0
  88. data/lib/expressir/express/formatter.rb +5 -1
  89. data/lib/expressir/express/formatters/remark_item_formatter.rb +25 -0
  90. data/lib/expressir/express/parser.rb +33 -0
  91. data/lib/expressir/manifest/resolver.rb +213 -0
  92. data/lib/expressir/manifest/validator.rb +195 -0
  93. data/lib/expressir/model/declarations/entity.rb +6 -0
  94. data/lib/expressir/model/dependency_resolver.rb +270 -0
  95. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  96. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  97. data/lib/expressir/model/indexes/type_index.rb +149 -0
  98. data/lib/expressir/model/interface_validator.rb +384 -0
  99. data/lib/expressir/model/repository.rb +400 -5
  100. data/lib/expressir/model/repository_validator.rb +295 -0
  101. data/lib/expressir/model/search_engine.rb +525 -0
  102. data/lib/expressir/model.rb +4 -94
  103. data/lib/expressir/package/builder.rb +200 -0
  104. data/lib/expressir/package/metadata.rb +81 -0
  105. data/lib/expressir/package/reader.rb +165 -0
  106. data/lib/expressir/schema_manifest.rb +11 -1
  107. data/lib/expressir/version.rb +1 -1
  108. data/lib/expressir.rb +16 -3
  109. metadata +115 -5
  110. data/docs/benchmarking.adoc +0 -107
  111. data/docs/liquid_drops.adoc +0 -1547
@@ -0,0 +1,664 @@
1
+ ---
2
+ title: Creating Packages
3
+ parent: LER Packages
4
+ grand_parent: Guides
5
+ nav_order: 1
6
+ ---
7
+
8
+ = Creating Packages
9
+
10
+ == Purpose
11
+
12
+ This guide explains how to create LER (Lutaml EXPRESS Repository) packages from
13
+ EXPRESS schemas using both the Ruby API and CLI commands. LER packages provide
14
+ a fast, compact way to distribute and deploy EXPRESS schemas.
15
+
16
+ == References
17
+
18
+ * link:index.html[LER Packages Overview]
19
+ * link:loading-packages.html[Loading Packages]
20
+ * link:package-formats.html[Package Formats]
21
+ * link:../ruby-api/working-with-repository.html[Working with Repository]
22
+
23
+ == Concepts
24
+
25
+ LER package:: A ZIP archive containing serialized EXPRESS schemas, pre-built
26
+ indexes, and metadata for fast loading and querying.
27
+
28
+ Package builder:: The [`Expressir::Package::Builder`](../../lib/expressir/package/builder.rb) class
29
+ responsible for creating LER packages from repository instances.
30
+
31
+ Resolution mode:: Controls whether schemas are serialized with resolved
32
+ references (`resolved`) or kept separate (`bare`).
33
+
34
+ Express mode:: Controls whether original EXPRESS files are included in the
35
+ package (`include_all`) or external files are allowed (`allow_external`).
36
+
37
+ Serialization format:: The format used to store schemas: `marshal` (binary),
38
+ `yaml` (human-readable), or `json` (portable).
39
+
40
+ == Building packages from Ruby API
41
+
42
+ === Basic package creation
43
+
44
+ Create a LER package from a repository using the
45
+ [`export_to_package`](../../lib/expressir/model/repository.rb:270) method:
46
+
47
+ [source,ruby]
48
+ ----
49
+ require "expressir"
50
+
51
+ # Parse schemas
52
+ repo = Expressir::Model::Repository.from_files([
53
+ "schemas/action_schema.exp",
54
+ "schemas/approval_schema.exp"
55
+ ])
56
+
57
+ # Export to LER package
58
+ repo.export_to_package("output.ler")
59
+ ----
60
+
61
+ This creates a package with default options:
62
+
63
+ * `name`: "Unnamed Package"
64
+ * `version`: "1.0.0"
65
+ * `express_mode`: "include_all"
66
+ * `resolution_mode`: "resolved"
67
+ * `serialization_format`: "marshal"
68
+
69
+ === Package with custom options
70
+
71
+ Specify package metadata and configuration:
72
+
73
+ [source,ruby]
74
+ ----
75
+ repo.export_to_package(
76
+ "production.ler",
77
+ name: "Production Schemas",
78
+ version: "2.1.0",
79
+ description: "Schema set for production deployment",
80
+ express_mode: "include_all",
81
+ resolution_mode: "resolved",
82
+ serialization_format: "marshal"
83
+ )
84
+ ----
85
+
86
+ === Using Package::Builder directly
87
+
88
+ For more control, use the [`Package::Builder`](../../lib/expressir/package/builder.rb:11) class directly:
89
+
90
+ [source,ruby]
91
+ ----
92
+ require "expressir/package/builder"
93
+
94
+ # Create builder
95
+ builder = Expressir::Package::Builder.new
96
+
97
+ # Build package with options
98
+ builder.build(
99
+ repo,
100
+ "custom.ler",
101
+ name: "Custom Package",
102
+ version: "1.0.0",
103
+ description: "Custom configuration",
104
+ express_mode: "include_all",
105
+ resolution_mode: "resolved",
106
+ serialization_format: "yaml"
107
+ )
108
+ ----
109
+
110
+ == Building packages from CLI
111
+
112
+ === Basic CLI command
113
+
114
+ The [`expressir package build`](../../lib/expressir/commands/package.rb:31) command creates
115
+ packages from command line:
116
+
117
+ [source,bash]
118
+ ----
119
+ # Build from a single schema file
120
+ expressir package build schemas/action_schema.exp output.ler
121
+
122
+ # With package metadata
123
+ expressir package build schemas/action_schema.exp output.ler \
124
+ --name "Action Schema Package" \
125
+ --version "1.0.0" \
126
+ --description "Action schema and dependencies"
127
+ ----
128
+
129
+ === Automatic dependency resolution
130
+
131
+ The build command automatically resolves and includes all dependencies:
132
+
133
+ [source,bash]
134
+ ----
135
+ # Build from root schema - dependencies auto-resolved
136
+ expressir package build schemas/activity/mim.exp activity.ler \
137
+ --name "Activity Module" \
138
+ --version "4.3" \
139
+ --description "ISO 10303-41 Activity Module"
140
+ ----
141
+
142
+ Dependencies are found by following `USE FROM` and `REFERENCE FROM` statements.
143
+
144
+ === CLI build options
145
+
146
+ ==== Package identification
147
+
148
+ [source,bash]
149
+ ----
150
+ expressir package build input.exp output.ler \
151
+ --name "Package Name" \
152
+ --version "2.0.0" \
153
+ --description "Detailed description"
154
+ ----
155
+
156
+ ==== Express bundling mode
157
+
158
+ [source,bash]
159
+ ----
160
+ # Include original EXPRESS files (default)
161
+ expressir package build input.exp output.ler \
162
+ --express-mode include_all
163
+
164
+ # Allow external EXPRESS files
165
+ expressir package build input.exp output.ler \
166
+ --express-mode allow_external
167
+ ----
168
+
169
+ ==== Resolution mode
170
+
171
+ [source,bash]
172
+ ----
173
+ # Pre-resolve all references (default, recommended)
174
+ expressir package build input.exp output.ler \
175
+ --resolution-mode resolved
176
+
177
+ # Keep schemas separate (rarely used)
178
+ expressir package build input.exp output.ler \
179
+ --resolution-mode bare
180
+ ----
181
+
182
+ ==== Serialization format
183
+
184
+ [source,bash]
185
+ ----
186
+ # Binary format for speed (default)
187
+ expressir package build input.exp output.ler \
188
+ --serialization-format marshal
189
+
190
+ # Human-readable YAML
191
+ expressir package build input.exp output.ler \
192
+ --serialization-format yaml
193
+
194
+ # JSON for portability
195
+ expressir package build input.exp output.ler \
196
+ --serialization-format json
197
+ ----
198
+
199
+ ==== Validation
200
+
201
+ [source,bash]
202
+ ----
203
+ # Validate before packaging (default)
204
+ expressir package build input.exp output.ler --validate
205
+
206
+ # Skip validation (faster but risky)
207
+ expressir package build input.exp output.ler --no-validate
208
+ ----
209
+
210
+ ==== Verbose output
211
+
212
+ [source,bash]
213
+ ----
214
+ # Show detailed build progress
215
+ expressir package build input.exp output.ler --verbose
216
+ ----
217
+
218
+ == Package configuration options
219
+
220
+ === Express mode options
221
+
222
+ `include_all` (default):: Includes original EXPRESS files in the package.
223
+ Recommended for most use cases.
224
+ +
225
+ .Benefits
226
+ [example]
227
+ ====
228
+ * Self-contained package
229
+ * Original source available for reference
230
+ * Debugging capability
231
+ * Documentation included
232
+ ====
233
+
234
+ `allow_external`:: Allows schemas to reference external EXPRESS files not
235
+ included in the package.
236
+ +
237
+ .Use when
238
+ [example]
239
+ ====
240
+ * Sharing only derived/generated schemas
241
+ * External dependencies managed separately
242
+ * Reducing package size for large schema sets
243
+ ====
244
+
245
+ === Resolution mode options
246
+
247
+ `resolved` (default):: All schema references are resolved and stored in the
248
+ package.
249
+ +
250
+ .Benefits
251
+ [example]
252
+ ====
253
+ * Fastest loading time
254
+ * No runtime resolution needed
255
+ * All dependencies included
256
+ * Self-contained
257
+ ====
258
+
259
+ `bare`:: Schemas stored without reference resolution.
260
+ +
261
+ .Benefits
262
+ [example]
263
+ ====
264
+ * Smaller package size
265
+ * Flexibility in resolution
266
+ * Useful for schema development
267
+ ====
268
+
269
+ === Serialization format options
270
+
271
+ `marshal` (default):: Ruby's native binary serialization.
272
+ +
273
+ .Characteristics
274
+ [example]
275
+ ====
276
+ * Fastest loading (5-10x faster than YAML)
277
+ * Most compact (40-60% of YAML size)
278
+ * Ruby-specific (not portable)
279
+ * Not human-readable
280
+ ====
281
+
282
+ `yaml`:: Human-readable YAML format.
283
+ +
284
+ .Characteristics
285
+ [example]
286
+ ====
287
+ * Slower loading than Marshal
288
+ * Larger file size
289
+ * Text-based and portable
290
+ * Debuggable and inspectable
291
+ ====
292
+
293
+ `json`:: JSON format for maximum portability.
294
+ +
295
+ .Characteristics
296
+ [example]
297
+ ====
298
+ * Similar performance to YAML
299
+ * Wide tool support
300
+ * Language-independent
301
+ * Debuggable and inspectable
302
+ ====
303
+
304
+ == Dependency resolution
305
+
306
+ === Automatic resolution
307
+
308
+ The CLI build command uses
309
+ [`DependencyResolver`](../../lib/expressir/model/dependency_resolver.rb) to
310
+ find all required schemas:
311
+
312
+ [source,ruby]
313
+ ----
314
+ require "expressir/model/dependency_resolver"
315
+
316
+ # Resolve dependencies
317
+ resolver = Expressir::Model::DependencyResolver.new
318
+ schema_files = resolver.resolve_dependencies("schemas/activity/mim.exp")
319
+
320
+ puts "Found #{schema_files.size} schema files"
321
+ schema_files.each { |f| puts " - #{f}" }
322
+ ----
323
+
324
+ === Resolution behavior
325
+
326
+ The resolver:
327
+
328
+ 1. Parses the root schema
329
+ 2. Extracts `USE FROM` and `REFERENCE FROM` statements
330
+ 3. Locates referenced schema files
331
+ 4. Recursively processes dependencies
332
+ 5. Returns complete file list
333
+
334
+ === Base directories
335
+
336
+ Specify base directories for schema resolution:
337
+
338
+ [source,bash]
339
+ ----
340
+ # Single base directory
341
+ expressir package build mim.exp output.ler \
342
+ --base-dirs "/path/to/schemas"
343
+
344
+ # Multiple base directories
345
+ expressir package build mim.exp output.ler \
346
+ --base-dirs "/path/to/schemas,/another/path"
347
+ ----
348
+
349
+ == Optimization strategies
350
+
351
+ === Choose the right serialization format
352
+
353
+ For production deployments:
354
+
355
+ [source,bash]
356
+ ----
357
+ # Fastest loading with Marshal
358
+ expressir package build input.exp production.ler \
359
+ --serialization-format marshal
360
+ ----
361
+
362
+ For development and debugging:
363
+
364
+ [source,bash]
365
+ ----
366
+ # Human-readable with YAML
367
+ expressir package build input.exp debug.ler \
368
+ --serialization-format yaml
369
+ ----
370
+
371
+ === Include pre-built indexes
372
+
373
+ Indexes are automatically built and included:
374
+
375
+ * Entity index: Fast entity lookups by qualified name
376
+ * Type index: Fast type lookups with category filtering
377
+ * Reference index: Tracks inter-schema dependencies
378
+
379
+ No additional configuration needed - indexes are always included.
380
+
381
+ === Minimize package size
382
+
383
+ If size is critical:
384
+
385
+ [source,bash]
386
+ ----
387
+ # Use Marshal format and exclude EXPRESS files
388
+ expressir package build input.exp minimal.ler \
389
+ --serialization-format marshal \
390
+ --express-mode allow_external
391
+ ----
392
+
393
+ .Size comparison example
394
+ [example]
395
+ ====
396
+ [source]
397
+ ----
398
+ Package configuration | Size
399
+ ------------------------------|------
400
+ marshal + include_all | 1.2 MB (baseline)
401
+ marshal + allow_external | 0.8 MB (33% smaller)
402
+ yaml + include_all | 2.1 MB (75% larger)
403
+ json + include_all | 2.3 MB (92% larger)
404
+ ----
405
+ ====
406
+
407
+ == Automation in CI/CD
408
+
409
+ === GitHub Actions example
410
+
411
+ [source,yaml]
412
+ ----
413
+ name: Build LER Package
414
+
415
+ on:
416
+ push:
417
+ branches: [main]
418
+
419
+ jobs:
420
+ build-package:
421
+ runs-on: ubuntu-latest
422
+ steps:
423
+ - uses: actions/checkout@v2
424
+
425
+ - name: Set up Ruby
426
+ uses: ruby/setup-ruby@v1
427
+ with:
428
+ ruby-version: 3.0
429
+
430
+ - name: Install Expressir
431
+ run: gem install expressir
432
+
433
+ - name: Build LER package
434
+ run: |
435
+ expressir package build \
436
+ schemas/main.exp \
437
+ output/schemas.ler \
438
+ --name "Schema Package" \
439
+ --version "${{ github.sha }}" \
440
+ --validate \
441
+ --verbose
442
+
443
+ - name: Upload artifact
444
+ uses: actions/upload-artifact@v2
445
+ with:
446
+ name: ler-package
447
+ path: output/schemas.ler
448
+ ----
449
+
450
+ === Rake task example
451
+
452
+ Create a Rake task for building packages:
453
+
454
+ [source,ruby]
455
+ ----
456
+ # Rakefile
457
+ require "expressir"
458
+
459
+ desc "Build LER package for production"
460
+ task :build_package do
461
+ puts "Building LER package..."
462
+
463
+ repo = Expressir::Model::Repository.from_files(
464
+ Dir.glob("schemas/**/*.exp")
465
+ )
466
+
467
+ repo.export_to_package(
468
+ "dist/production.ler",
469
+ name: "Production Schemas",
470
+ version: ENV["VERSION"] || "dev",
471
+ description: "Production schema package",
472
+ express_mode: "include_all",
473
+ serialization_format: "marshal"
474
+ )
475
+
476
+ puts "Package created: dist/production.ler"
477
+ puts "Size: #{File.size("dist/production.ler")} bytes"
478
+ end
479
+ ----
480
+
481
+ Run with:
482
+
483
+ [source,bash]
484
+ ----
485
+ VERSION=1.2.0 rake build_package
486
+ ----
487
+
488
+ === Build script example
489
+
490
+ Create a reusable build script:
491
+
492
+ [source,ruby]
493
+ ----
494
+ #!/usr/bin/env ruby
495
+ # build_package.rb
496
+
497
+ require "expressir"
498
+ require "optparse"
499
+
500
+ options = {
501
+ name: "Schema Package",
502
+ version: "1.0.0",
503
+ format: "marshal"
504
+ }
505
+
506
+ OptionParser.new do |opts|
507
+ opts.banner = "Usage: build_package.rb INPUT OUTPUT [options]"
508
+
509
+ opts.on("--name NAME", "Package name") do |v|
510
+ options[:name] = v
511
+ end
512
+
513
+ opts.on("--version VERSION", "Package version") do |v|
514
+ options[:version] = v
515
+ end
516
+
517
+ opts.on("--format FORMAT", "Serialization format") do |v|
518
+ options[:format] = v
519
+ end
520
+ end.parse!
521
+
522
+ input = ARGV[0] || abort("INPUT file required")
523
+ output = ARGV[1] || abort("OUTPUT file required")
524
+
525
+ puts "Building package: #{output}"
526
+ repo = Expressir::Express::Parser.from_file(input)
527
+
528
+ repo.export_to_package(
529
+ output,
530
+ name: options[:name],
531
+ version: options[:version],
532
+ serialization_format: options[:format]
533
+ )
534
+
535
+ puts "✓ Package created successfully"
536
+ ----
537
+
538
+ == Troubleshooting build errors
539
+
540
+ === Common errors and solutions
541
+
542
+ ==== Schema parse failure
543
+
544
+ .Error
545
+ [example]
546
+ ====
547
+ [source]
548
+ ----
549
+ Error building package: Failed to parse schema: unexpected token
550
+ ----
551
+ ====
552
+
553
+ .Solution
554
+ [example]
555
+ ====
556
+ 1. Validate EXPRESS syntax manually
557
+ 2. Check for missing semicolons or keywords
558
+ 3. Use `expressir validate` command first
559
+ ====
560
+
561
+ ==== Missing dependencies
562
+
563
+ .Error
564
+ [example]
565
+ ====
566
+ [source]
567
+ ----
568
+ Error: Referenced schema not found: geometric_model_schema
569
+ ----
570
+ ====
571
+
572
+ .Solution
573
+ [example]
574
+ ====
575
+ 1. Check `--base-dirs` parameter
576
+ 2. Ensure all referenced schemas are accessible
577
+ 3. Verify schema file names match schema IDs
578
+ ====
579
+
580
+ ==== Invalid metadata
581
+
582
+ .Error
583
+ [example]
584
+ ====
585
+ [source]
586
+ ----
587
+ Invalid metadata: serialization_format must be 'marshal', 'json', or 'yaml'
588
+ ----
589
+ ====
590
+
591
+ .Solution
592
+ [example]
593
+ ====
594
+ Check that all options have valid values:
595
+ * `express_mode`: "include_all" or "allow_external"
596
+ * `resolution_mode`: "resolved" or "bare"
597
+ * `serialization_format`: "marshal", "json", or "yaml"
598
+ ====
599
+
600
+ ==== Out of memory
601
+
602
+ .Error
603
+ [example]
604
+ ====
605
+ [source]
606
+ ----
607
+ Error: Cannot allocate memory
608
+ ----
609
+ ====
610
+
611
+ .Solution
612
+ [example]
613
+ ====
614
+ 1. Use `marshal` format (most compact)
615
+ 2. Build smaller packages
616
+ 3. Increase available memory
617
+ 4. Use `--no-validate` to skip validation step
618
+ ====
619
+
620
+ === Debugging build process
621
+
622
+ Enable verbose output to see detailed progress:
623
+
624
+ [source,bash]
625
+ ----
626
+ expressir package build input.exp output.ler --verbose
627
+ ----
628
+
629
+ Output shows:
630
+
631
+ * Dependency resolution progress
632
+ * Number of schemas found
633
+ * Validation results
634
+ * Package creation status
635
+
636
+ == Next steps
637
+
638
+ * link:loading-packages.html[Loading Packages] - Learn how to load and use LER
639
+ packages
640
+ * link:querying-packages.html[Querying Packages] - Search package contents
641
+ * link:validating-packages.html[Validating Packages] - Verify package integrity
642
+ * link:package-formats.html[Package Formats] - Compare serialization formats
643
+
644
+ == Summary
645
+
646
+ Key takeaways for creating LER packages:
647
+
648
+ * Use `repo.export_to_package()` for Ruby API
649
+ * Use `expressir package build` for CLI
650
+ * Dependencies are automatically resolved
651
+ * Choose `marshal` format for production (fastest)
652
+ * Choose `yaml` or `json` for debugging (readable)
653
+ * Include validation in CI/CD pipelines
654
+ * Use `include_all` mode for self-contained packages
655
+ * Pre-built indexes are automatically included
656
+
657
+ Best practices:
658
+
659
+ * Validate schemas before packaging
660
+ * Use semantic versioning
661
+ * Document package contents in description
662
+ * Automate builds in CI/CD
663
+ * Test packages after creation
664
+ * Keep original EXPRESS files in version control