platform/packages/process/doc/core.md

112 lines
2.8 KiB
Markdown
Raw Normal View History

# Core Components
The Process package provides several core components for process management:
## Factory
The `Factory` class is the main entry point for creating and managing processes. It provides methods for:
- Creating new processes with `command()`
- Creating process pools with `pool()`
- Creating process pipes with `pipeThrough()`
- Setting up process faking for testing
Example:
```dart
final factory = Factory();
// Simple command execution
final result = await factory
.command('echo "Hello, World!"')
.run();
// With configuration
final result = await factory
.command('npm install')
.path('/path/to/project')
.env({'NODE_ENV': 'production'})
.run();
```
## PendingProcess
The `PendingProcess` class represents a process that has been configured but not yet started. It provides a fluent interface for:
- Setting working directory with `path()`
- Setting environment variables with `env()`
- Setting timeouts with `timeout()` and `idleTimeout()`
- Providing input with `input()`
- Controlling output with `quietly()`
- Enabling TTY mode with `tty()`
Example:
```dart
final process = factory
.command('long-running-task')
.path('/working/directory')
.env({'DEBUG': 'true'})
.timeout(60)
.idleTimeout(10)
.tty();
```
## ProcessResult
The `ProcessResult` class represents the result of a process execution, providing:
- Exit code access with `exitCode()`
- Output access with `output()` and `errorOutput()`
- Success/failure checking with `successful()` and `failed()`
- Error handling with `throwIfFailed()`
- Output searching with `seeInOutput()` and `seeInErrorOutput()`
Example:
```dart
final result = await process.run();
if (result.successful()) {
print('Output: ${result.output()}');
} else {
print('Error: ${result.errorOutput()}');
result.throwIfFailed();
}
```
## Error Handling
The package includes robust error handling through:
- `ProcessFailedException` for process execution failures
- Timeout handling for both overall execution and idle time
- Detailed error messages with command, exit code, and output
- Optional error callbacks for custom error handling
Example:
```dart
try {
await factory
.command('risky-command')
.run();
} catch (e) {
if (e is ProcessFailedException) {
print('Process failed with exit code: ${e.exitCode}');
print('Error output: ${e.errorOutput}');
}
}
```
## Best Practices
1. Always handle process failures appropriately
2. Use timeouts for long-running processes
3. Consider using `quietly()` for noisy processes
4. Clean up resources with proper error handling
5. Use environment variables for configuration
6. Set appropriate working directories
7. Consider TTY mode for interactive processes
For more details on specific components, see:
- [Process Execution](execution.md)
- [Process Coordination](coordination.md)
- [Testing Utilities](testing.md)