116 lines
3.2 KiB
Markdown
116 lines
3.2 KiB
Markdown
# FileSystem
|
|
|
|
[![Module Version](https://img.shields.io/hexpm/v/file_system.svg)](https://hex.pm/packages/file_system)
|
|
[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/file_system/)
|
|
[![Total Download](https://img.shields.io/hexpm/dt/file_system.svg)](https://hex.pm/packages/file_system)
|
|
[![License](https://img.shields.io/hexpm/l/file_system.svg)](https://github.com/falood/file_system/blob/master/LICENSE)
|
|
[![Last Updated](https://img.shields.io/github/last-commit/falood/file_system.svg)](https://github.com/falood/file_system/commits/master)
|
|
[![CI Linux](https://github.com/falood/file_system/actions/workflows/ci-linux.yml/badge.svg)](https://github.com/falood/file_system/actions)
|
|
[![CI MacOS](https://github.com/falood/file_system/actions/workflows/ci-macos.yml/badge.svg)](https://github.com/falood/file_system/actions)
|
|
[![CI Windows](https://github.com/falood/file_system/actions/workflows/ci-windows.yml/badge.svg)](https://github.com/falood/file_system/actions)
|
|
|
|
An Elixir file change watcher wrapper based on
|
|
[FS](https://github.com/synrc/fs), the native file system listener.
|
|
|
|
## System Support
|
|
|
|
- MacOS - [fsevent](https://github.com/thibaudgg/rb-fsevent)
|
|
- GNU/Linux, FreeBSD and OpenBSD - [inotify](https://github.com/rvoicilas/inotify-tools/wiki)
|
|
- Windows - [inotify-win](https://github.com/thekid/inotify-win)
|
|
|
|
On MacOS 10.14, to compile `mac_listener`, run:
|
|
|
|
```console
|
|
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
|
|
```
|
|
|
|
## Usage
|
|
|
|
Add `file_system` to the `deps` of your mix.exs
|
|
|
|
``` elixir
|
|
defmodule MyApp.Mixfile do
|
|
use Mix.Project
|
|
|
|
def project do
|
|
...
|
|
end
|
|
|
|
defp deps do
|
|
[
|
|
{:file_system, "~> 1.0", only: :test},
|
|
]
|
|
end
|
|
...
|
|
end
|
|
```
|
|
|
|
### Subscription API
|
|
|
|
You can spawn a worker and subscribe to events from it:
|
|
|
|
```elixir
|
|
{:ok, pid} = FileSystem.start_link(dirs: ["/path/to/some/files"])
|
|
FileSystem.subscribe(pid)
|
|
```
|
|
|
|
or
|
|
|
|
```elixir
|
|
{:ok, pid} = FileSystem.start_link(dirs: ["/path/to/some/files"], name: :my_monitor_name)
|
|
FileSystem.subscribe(:my_monitor_name)
|
|
```
|
|
|
|
The `pid` you subscribed from will now receive messages like:
|
|
|
|
```
|
|
{:file_event, worker_pid, {file_path, events}}
|
|
```
|
|
and
|
|
|
|
```
|
|
{:file_event, worker_pid, :stop}
|
|
```
|
|
|
|
### Example Using GenServer
|
|
|
|
```elixir
|
|
defmodule Watcher do
|
|
use GenServer
|
|
|
|
def start_link(args) do
|
|
GenServer.start_link(__MODULE__, args)
|
|
end
|
|
|
|
def init(args) do
|
|
{:ok, watcher_pid} = FileSystem.start_link(args)
|
|
FileSystem.subscribe(watcher_pid)
|
|
{:ok, %{watcher_pid: watcher_pid}}
|
|
end
|
|
|
|
def handle_info({:file_event, watcher_pid, {path, events}}, %{watcher_pid: watcher_pid} = state) do
|
|
# Your own logic for path and events
|
|
{:noreply, state}
|
|
end
|
|
|
|
def handle_info({:file_event, watcher_pid, :stop}, %{watcher_pid: watcher_pid} = state) do
|
|
# Your own logic when monitor stop
|
|
{:noreply, state}
|
|
end
|
|
end
|
|
```
|
|
|
|
## Backend Options
|
|
|
|
For each platform, you can pass extra options to the underlying listener
|
|
process.
|
|
|
|
Each backend supports different extra options, check backend module
|
|
documentation for more details.
|
|
|
|
Here is an example to get instant notifications on file changes for MacOS:
|
|
|
|
```elixir
|
|
FileSystem.start_link(dirs: ["/path/to/some/files"], latency: 0, watch_root: true)
|
|
```
|