Added phplib section
This commit is contained in:
parent
de9ee13aa1
commit
79b5bafd3e
1 changed files with 343 additions and 2 deletions
345
DOCUMENTATION.md
345
DOCUMENTATION.md
|
@ -33,6 +33,7 @@ basic usage, standards, and much more.
|
|||
* [Creating a new project (create)](#creating-a-new-project-create)
|
||||
* [Applying Templates (template)](#applying-templates-template)
|
||||
* [phpcli template](#phpcli-template)
|
||||
* [phplib template](#phplib-template)
|
||||
* [Package Management (package or pkg)](#package-management-package-or-pkg)
|
||||
* [Listing Installed Packages (list)](#listing-installed-packages-list)
|
||||
* [Installing Packages (install)](#installing-packages-install)
|
||||
|
@ -577,7 +578,7 @@ build/release/com.example.cli_program.ncc
|
|||
To test your program, you can run `ncc exec` on the compiled binary package
|
||||
|
||||
```shell
|
||||
$ ncc exec --package build/release/com.example.cli_program.ncc
|
||||
$ ncc exec --package MyCommandLineProgram/build/release/com.example.cli_program.ncc
|
||||
Hello World from com.example.cli_program!
|
||||
```
|
||||
|
||||
|
@ -599,10 +600,349 @@ build/release/MyCommandLineProgram
|
|||
Now you may directly run the program without the need of `ncc exec`
|
||||
|
||||
```shell
|
||||
$ build/release/MyCommandLineProgram
|
||||
$ MyCommandLineProgram/build/release/MyCommandLineProgram
|
||||
Hello World from com.example.cli_program!
|
||||
```
|
||||
|
||||
#### phplib template
|
||||
|
||||
The phplib template is a template for creating a library project, allowing you to create a library with ease similar to
|
||||
creating a CLI program, this section will guide you through how to create a library for your program and how to use it
|
||||
as a dependency in another project. This section will use the previous `phpcli` template as a base for creating a library
|
||||
to use in a CLI program.
|
||||
|
||||
First, let's begin by creating a new project.
|
||||
|
||||
```shell
|
||||
$ ncc project create -n MyLibrary --pkg com.example.library --ext php
|
||||
No path specified, using 'MyLibrary'
|
||||
Project successfully created in 'MyLibrary'
|
||||
Modify the project configuration in 'MyLibrary/project.json'
|
||||
````
|
||||
|
||||
Next, let's apply the `phplib` template to the project.
|
||||
|
||||
```shell
|
||||
$ ncc project template -p MyLibrary -n phplib
|
||||
Template successfully applied to project in 'MyLibrary'
|
||||
```
|
||||
|
||||
Similarly to phpcli, additional files will be created for your project
|
||||
|
||||
```shell
|
||||
$ tree MyLibrary
|
||||
MyLibrary/
|
||||
├── Makefile
|
||||
├── project.json
|
||||
└── src
|
||||
└── MyLibrary
|
||||
└── MyLibrary.php
|
||||
```
|
||||
|
||||
This is a blank library, you can write your code however you want, but for this example we are going to demonstrate
|
||||
a function call with this template to show how it works, first we'll modify the `MyLibrary.php` file to add a function
|
||||
that returns a string.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
namespace MyLibrary;
|
||||
|
||||
class MyLibrary
|
||||
{
|
||||
public function getName(string $name): string
|
||||
{
|
||||
return sprintf("Hello %s!", $name);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Next, we'll build the library
|
||||
|
||||
```shell
|
||||
$ ncc build -p MyLibrary
|
||||
Building project 'MyLibrary'
|
||||
[ =========== ] 100% 1/1 remaining: 0 sec. elapsed: 0 sec.
|
||||
build/release/com.example.library.ncc
|
||||
```
|
||||
|
||||
Finally, we'll install it onto the system so we can actually use it
|
||||
|
||||
```shell
|
||||
$ sudo ncc package install -p build/release/com.example.library.ncc -y
|
||||
Package installation information:
|
||||
UUID: de1df7b6-108f-4cfc-a818-416bad08daa9
|
||||
Name: MyLibrary
|
||||
Package: com.example.library
|
||||
Version: 1.0.0
|
||||
|
||||
Installing package com.example.library=1.0.0
|
||||
[ =========== ] 100% 7/7 remaining: 0 sec. elapsed: 0 sec.
|
||||
Installed 1 packages
|
||||
```
|
||||
|
||||
Now we should be able to see the package on the system when we run `ncc package list`
|
||||
|
||||
```shell
|
||||
$ ncc package list
|
||||
com.example.library=1.0.0
|
||||
Total: 1 packages
|
||||
```
|
||||
|
||||
Great! We created a library and installed it onto the system, let's test it by running `php -a` to open the PHP shell
|
||||
and import the package and test its function call
|
||||
|
||||
```shell
|
||||
$ php -a
|
||||
|
||||
Interactive shell
|
||||
|
||||
php > require 'ncc';
|
||||
php > import('com.example.library');
|
||||
php >
|
||||
php > $my_library = new \MyLibrary\MyLibrary();
|
||||
php > echo $my_library->getName('John');
|
||||
Hello John!
|
||||
```
|
||||
|
||||
But libraries are usually used by other programs, so let's go back to our `MyCommandLineProgram` project and use the
|
||||
library we just created. If you don't have the project, you can create it by following the steps in the
|
||||
[phpcli template](#phpcli-template) section.
|
||||
|
||||
First, we'll need to add the library as a dependency to the project, this can be done by editing the `project.json` in
|
||||
the `build` section by creating an array of dependencies you need, a dependency looks something like this once it's
|
||||
defined in `project.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "com.example.library",
|
||||
"version": "latest"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Now if you hosted your project on a remote source, you may also define where ncc should get the package from if the
|
||||
dependency is not available on the system.
|
||||
|
||||
```json
|
||||
{
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "com.example.library",
|
||||
"version": "latest",
|
||||
"source": "johndoe/example_library=latest@n64"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
overall, your project.json file should look something like this
|
||||
|
||||
```json
|
||||
{
|
||||
"project": {
|
||||
"compiler": {
|
||||
"extension": "php",
|
||||
"minimum_version": "8.2",
|
||||
"maximum_version": "8.0"
|
||||
},
|
||||
"options": {
|
||||
"create_symlink": true
|
||||
}
|
||||
},
|
||||
"assembly": {
|
||||
"name": "MyCommandLineProgram",
|
||||
"package": "com.example.cli_program",
|
||||
"version": "1.0.0",
|
||||
"uuid": "462a7f76-2cdc-428a-bbc6-c5feba614799"
|
||||
},
|
||||
"build": {
|
||||
"source_path": "src/MyCommandLineProgram",
|
||||
"default_configuration": "release",
|
||||
"main": "main_policy",
|
||||
"define_constants": {
|
||||
"ASSEMBLY_PACKAGE": "%ASSEMBLY.PACKAGE%",
|
||||
"ASSEMBLY_VERSION": "%ASSEMBLY.VERSION%",
|
||||
"ASSEMBLY_UID": "%ASSEMBLY.UID%"
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "com.example.library",
|
||||
"version": "latest"
|
||||
}
|
||||
],
|
||||
"configurations": [
|
||||
{
|
||||
"name": "release",
|
||||
"build_type": "ncc",
|
||||
"output": "build/release/%ASSEMBLY.PACKAGE%.ncc"
|
||||
},
|
||||
{
|
||||
"name": "debug",
|
||||
"build_type": "ncc",
|
||||
"output": "build/debug/%ASSEMBLY.PACKAGE%.ncc",
|
||||
"define_constants": {
|
||||
"DEBUG": "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "release_executable",
|
||||
"build_type": "executable",
|
||||
"output": "build/release/%ASSEMBLY.NAME%",
|
||||
"options": {
|
||||
"ncc_configuration": "release"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "debug_executable",
|
||||
"build_type": "executable",
|
||||
"output": "build/debug/%ASSEMBLY.NAME%",
|
||||
"options": {
|
||||
"ncc_configuration": "debug"
|
||||
},
|
||||
"define_constants": {
|
||||
"DEBUG": "1"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"execution_policies": [
|
||||
{
|
||||
"name": "main_policy",
|
||||
"runner": "php",
|
||||
"execute": {
|
||||
"working_directory": "%CWD%",
|
||||
"silent": false,
|
||||
"tty": true,
|
||||
"timeout": null,
|
||||
"idle_timeout": null,
|
||||
"target": "main"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Once you have defined the dependency on your program, let's modify the CLI program to use the library we created, we'll
|
||||
modify the `src/MyCommandLineProgram/Program.php` file to use the library.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
namespace MyCommandLineProgram;
|
||||
|
||||
class Program
|
||||
{
|
||||
/**
|
||||
* MyCommandLineProgram main entry point
|
||||
*
|
||||
* @param string[] $args Command-line arguments
|
||||
* @return int Exit code
|
||||
*/
|
||||
public static function main(array $args): int
|
||||
{
|
||||
// Create a new instance of the library
|
||||
$my_library = new \MyLibrary\MyLibrary();
|
||||
|
||||
// Call the getName function
|
||||
print($my_library->getName('John') . PHP_EOL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Notice how we don't use the `import()` function to import the package, this is because ncc's import system will take a
|
||||
look at the requirements that your package needs and automatically import them for you, this is useful for CLI programs
|
||||
as it allows you to import packages without having to worry about whether the package is installed or not. This works
|
||||
recursively, so if the package you imported also has a dependency, it will also be imported.
|
||||
|
||||
Now let's build the program
|
||||
|
||||
```shell
|
||||
$ ncc build -p MyCommandLineProgram
|
||||
Building project 'MyCommandLineProgram'
|
||||
[ =========== ] 100% 2/2 remaining: 0 sec. elapsed: 0 sec.
|
||||
build/release/com.example.cli_program.ncc
|
||||
```
|
||||
|
||||
And let's test it!
|
||||
|
||||
```shell
|
||||
$ ncc exec --package MyCommandLineProgram/build/release/com.example.cli_program.ncc
|
||||
Hello John!
|
||||
```
|
||||
|
||||
Great! We successfully created a library and used it in a CLI program, this is just a simple example of how to use the
|
||||
phplib template, you can use it however you want to create your own libraries and use them in your projects.
|
||||
|
||||
If you'd like to create a build a static version of your package where all your dependencies are bundled into one file,
|
||||
you can modify the project.json file to achieve this, more specifically the build configuration, in this case the
|
||||
default build configuration we're using is called `release` so we'd need to adjust the configuration as so by adding the
|
||||
`static` option to the configuration.
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "release",
|
||||
"build_type": "ncc",
|
||||
"output": "build/release/%ASSEMBLY.PACKAGE%.ncc",
|
||||
"options": {
|
||||
"static": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Now let's build the program again and test it
|
||||
|
||||
```shell
|
||||
$ ncc build -p MyCommandLineProgram
|
||||
Building project 'MyCommandLineProgram'
|
||||
[ =========== ] 100% 2/2 remaining: 0 sec. elapsed: 0 sec.
|
||||
$ ncc exec --package MyCommandLineProgram/build/release/com.example.cli_program.ncc
|
||||
Hello John!
|
||||
```
|
||||
|
||||
And if you'd like to confirm if the dependencies are actually bundled into your program, you may ues the package
|
||||
inspection command to view its headers, inside it you'll notice the components for `MyLibrary` being bundled into the
|
||||
package.
|
||||
|
||||
```shell
|
||||
$ ncc ins -p MyCommandLineProgram/build/release/com.example.cli_program.ncc headers
|
||||
headers
|
||||
1937008233: '2.0'
|
||||
1936941414:
|
||||
- static_dependencies
|
||||
1869898597:
|
||||
'@1835365473': '0:137'
|
||||
'@1634956133': '137:114'
|
||||
'@1702389091:main_policy': '251:868'
|
||||
'@1668246896:src/MyCommandLineProgram/Program.php': '1119:2996'
|
||||
'@1668047219:MyCommandLineProgram\Program': '1119:2996'
|
||||
'@1684369509:com.example.library': '4115:40'
|
||||
'@1668246896:src/MyLibrary.php': '4155:1366'
|
||||
'@1668047219:MyLibrary\MyLibrary': '4155:1366
|
||||
```
|
||||
|
||||
You may uninstall the package `com.example.library` from the system and try to run the program again, you'll notice that
|
||||
the program will still run without any issues, this is because the package is bundled into the program itself.
|
||||
|
||||
```shell
|
||||
$ sudo ncc package uninstall -p com.example.library -y
|
||||
Uninstalling package com.example.library=1.0.0
|
||||
Uninstalled 1 packages
|
||||
|
||||
$ ncc exec --package MyCommandLineProgram/build/release/com.example.cli_program.ncc
|
||||
Hello John!
|
||||
```
|
||||
|
||||
And that's the magic that ncc does for you, it allows you to create libraries and bundle them into your programs without
|
||||
having to worry about whether the library is installed or not, and with its import system you no longer have to worry
|
||||
about autoloaders or anything like that, ncc will take care of that for you. This is what composer cannot do, composer
|
||||
can only install packages onto your project directory, but it cannot bundle them into your programs if you wish to
|
||||
have an easy way to distribute your project to other people, this is where ncc shines.
|
||||
|
||||
## Package Management (package or pkg)
|
||||
|
||||
|
@ -625,6 +965,7 @@ $ ncc package list
|
|||
Total: 4 packages
|
||||
```
|
||||
|
||||
|
||||
### Installing Packages (install)
|
||||
|
||||
To install a package, you can use the `package install` command, this command will install the specified package and
|
||||
|
|
Loading…
Add table
Reference in a new issue