113 lines
2.3 KiB
Markdown
113 lines
2.3 KiB
Markdown
# Development
|
|
|
|
## Repository Layout
|
|
|
|
Main folders:
|
|
|
|
- `VirtualFS/`
|
|
- `VirtualFS/Implementation/`
|
|
- `VirtualFS/Physical/`
|
|
- `VirtualFS/Memory/`
|
|
- `VirtualFS/Compressed/`
|
|
- `VirtualFS/EmbeddedResource/`
|
|
- `VirtualFS.Tests/`
|
|
|
|
Important files:
|
|
|
|
- `VirtualFS.sln`
|
|
- `VirtualFS/VirtualFS.csproj`
|
|
- `VirtualFS.Tests/VirtualFS.Tests.csproj`
|
|
- `Dockerfile`
|
|
- `.github/workflows/docker.yml`
|
|
|
|
## Target Frameworks
|
|
|
|
Library targets:
|
|
|
|
- `netstandard2.0`
|
|
- `net472`
|
|
- `net6.0`
|
|
- `net8.0`
|
|
- `net10.0`
|
|
|
|
Tests target:
|
|
|
|
- `net10.0`
|
|
|
|
## Build and Test
|
|
|
|
The repository uses a Docker-based build/test flow with the official .NET 10 SDK image.
|
|
|
|
Run the full containerized verification:
|
|
|
|
```bash
|
|
docker build --target test -t virtualfs:test .
|
|
```
|
|
|
|
This performs:
|
|
|
|
- restore
|
|
- build
|
|
- test
|
|
|
|
## Test Stack
|
|
|
|
The test project currently uses:
|
|
|
|
- xUnit v3
|
|
- `Microsoft.NET.Test.Sdk`
|
|
- `coverlet.collector`
|
|
|
|
## CI
|
|
|
|
The repository workflow is:
|
|
|
|
- `.github/workflows/docker.yml`
|
|
|
|
It runs the same Docker build/test path on:
|
|
|
|
- pushes
|
|
- pull requests
|
|
|
|
## Adding a New Backend
|
|
|
|
The expected implementation approach is:
|
|
|
|
1. derive from `BaseFileSystem`
|
|
2. implement the abstract operations required by `IFileSystem`
|
|
3. return `VirtualStream` for open file handles
|
|
4. populate entry metadata consistently
|
|
5. respect read-only semantics
|
|
6. add focused tests for backend-specific behavior
|
|
|
|
Backend responsibilities generally include:
|
|
|
|
- existence checks
|
|
- metadata lookup
|
|
- enumeration
|
|
- create/delete
|
|
- read/write stream opening
|
|
- rename/move/copy where backend-specific optimization is useful
|
|
|
|
## Design Characteristics to Keep in Mind
|
|
|
|
These are important when changing the library:
|
|
|
|
- path semantics are custom and intentionally `/`-based
|
|
- directory vs file is determined by trailing slash
|
|
- `RootFileSystem` composes mounted backends but is not itself writable
|
|
- `Entry.Path` is backend-local, `Entry.FullPath` is root-visible
|
|
- `EntryRealPath` may be unavailable for some backends
|
|
- unmounting depends on `IsBusy`
|
|
- generic copy/move logic may be correct but not optimal for remote backends
|
|
|
|
## Documentation Structure
|
|
|
|
Current documentation:
|
|
|
|
- top-level overview: `README.md`
|
|
- architecture details: `docs/architecture.md`
|
|
- usage examples: `docs/usage.md`
|
|
- backend summary: `docs/backends.md`
|
|
- development notes: `docs/development.md`
|