aboutsummaryrefslogtreecommitdiffhomepage
path: root/docs/known-incompatibilities.md
blob: e8e6a038825864e6a5ae3fcdcde992c410785c9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Known Incompatibilities

NOTE: This is not an exhaustive list. Shirabe is in early development and there are still a number of significant incompatibilities with Composer that are not documented here yet.


## Error Messages

Error messages, in particular those from PHP built-in functions, are not intended to be mapped exactly.
Plugins or external tools that rely on error messages may break.


## Default Home/Cache/Data Directories

To avoid conflicting with an existing Composer installation, Shirabe's default system directories
use `shirabe`/`Shirabe` instead of `composer`/`Composer`.

| Purpose   | OS            | Composer default                | Shirabe default                |
| --------- | ------------- | ------------------------------- | ------------------------------ |
| Home dir  | Unix, XDG     | `$XDG_CONFIG_HOME/composer`     | `$XDG_CONFIG_HOME/shirabe`     |
| Home dir  | Unix, non-XDG | `$HOME/.composer`               | `$HOME/.shirabe`               |
| Home dir  | Windows       | `%APPDATA%/Composer`            | `%APPDATA%/Shirabe`            |
| Cache dir | Unix, XDG     | `$XDG_CACHE_HOME/composer`      | `$XDG_CACHE_HOME/shirabe`      |
| Cache dir | macOS         | `$HOME/Library/Caches/composer` | `$HOME/Library/Caches/shirabe` |
| Cache dir | Windows       | `%LOCALAPPDATA%/Composer`       | `%LOCALAPPDATA%/Shirabe`       |
| Data dir  | Unix, XDG     | `$XDG_DATA_HOME/composer`       | `$XDG_DATA_HOME/shirabe`       |

The following are intentionally left unchanged for ecosystem compatibility:

* `composer.json` and `composer.lock`
* `vendor/composer/` directory

TODO: a CLI flag or an environment variable to force Shirabe to use compatible paths.


## Xdebug

Composer disables Xdebug on startup. Shirabe emulates it, but the exact
behavior is slightly different. See [docs/dev/xdebug.md](./dev/xdebug.md)
for details.


## Signals

Composer runs its abort handler almost immediately after the signal arrives.
Shirabe, however, runs it at the next checkpoint instead, so stopping `shirabe`
command by `Ctrl+C` may take more time than Composer.

Signal handling in plugins and scripts is undefined behavior: it may or may not
work. See [docs/dev/signals.md](./dev/signals.md) for details.


## Plugins

### Reflection

Reflection on Composer's own objects (`$composer`, `$io`, and everything reachable from them) is
not supported. Their properties are invisible to `ReflectionClass::getProperties()` and cannot be
read or written through `ReflectionProperty`; only the public methods reach the real values.
`ReflectionClass::getFileName()` and the method bodies do not describe Composer's sources either.

Reflection on objects a plugin creates itself works as usual.

### Output buffering functions

`ob_*()` functions work as usual in PHP, but cannot capture any output from
Rust side.