跳转到主要内容

设置

备注

如果你计划处理某个功能,请在 Discord 中通知我们,以便我们可以:

  1. 告知你该功能是否会被接受到 Immich 中
  2. 提供如何实现该功能的建议
  3. 确保没有人已经在处理该问题/功能,以避免重复工作

感谢你愿意贡献 😊

环境

服务

此环境包含以下服务。每个服务的更多详情请参见其 README 文件。

  • 服务端 - /server
  • Web 应用 - /web
  • 机器学习 - /machine-learning
  • Redis
  • 带有暴露端口 5432 的 PostgreSQL 开发数据库,你可以使用任意数据库客户端访问它

所有服务都已打包,可以通过单个 Docker Compose 命令运行。

服务端和 Web 应用

  1. 克隆项目代码库。
  2. 运行 cp docker/example.env docker/.env
  3. 编辑 docker/.env 文件,为必需的变量 UPLOAD_LOCATION 提供值。
  4. 从项目根目录运行:
启动开发服务
make dev # 系统需要预安装 Makefile。
  1. 在浏览器中访问开发实例:http://localhost:3000,或者通过移动应用连接。

所有服务会启动并启用热加载,以实现快速反馈循环。

你可以通过 http://your-machine-ip:3000http://localhost:3000 访问 Web,并通过移动应用通过 http://your-machine-ip:3000/api 访问服务端。

注意事项:

  • "web" 开发容器以 uid 1000 运行。如果该 uid 对挂载的卷没有读写权限,可能会遇到错误。
  • 如果使用无根 Docker 设置,则需要在容器中使用 root,否则会遇到与读写权限相关的错误,请参见 docker/docker-compose.dev.yml 文件中的注释。

将 Web 连接到远程后端

如果你只想进行 Web 开发并连接到一个已有的远程后端,请按照以下步骤操作:

  1. 构建 Immich SDK:cd open-api/typescript-sdk && npm i && npm run build && cd -
  2. 进入 Web 目录:cd web/
  3. 安装 Web 依赖:npm i
  4. 启动 Web 开发服务器
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev

如果您在 Windows 上使用 PowerShell,可能需要单独设置环境变量,如下所示:

$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
npm run dev

@immich/ui

要在 Immich 中查看对 @immich/ui 的本地更改,请按以下步骤操作:

  1. @immich/ui 安装为 immich/ 的兄弟目录,例如 /home/user/immich/home/user/ui
  2. 通过 npm run build 构建 @immich/ui 项目
  3. 取消注释 docker/docker-compose.dev.yaml 文件中 Web 服务的对应卷(../../ui:/usr/ui
  4. 取消注释 web/vite.config.js 文件中的对应别名('@immich/ui': path.resolve(__dirname, '../../ui')
  5. 取消注释 web/src/app.css 文件中的导入语句 @import '/usr/ui/dist/theme/default.css'; 并注释掉 @import '@immich/ui/theme/default.css';
  6. 通过 make dev 启动堆栈
  7. @immich/ui 中进行更改后,重新构建它(npm run build

移动端应用

设置

  1. 使用 FVM 设置 Flutter 工具链。
  2. 运行 flutter pub get 安装依赖项。
  3. 运行 make translation 生成翻译文件。
  4. 运行 fvm flutter run 启动应用。

翻译

要添加新翻译文本,请将键值对输入到 Immich 项目根目录中的 i18n/en.json 文件中。随后,从 mobile/ 目录运行:

make translation

移动端应用会询问你连接哪个后端。如果你不需要更改服务端代码或上传照片,可以使用演示后端(https://demo.immich.app/)。或者,你可以按照上述指示自行运行服务端。

IDE 设置

Lint / 格式化扩展

在 IDE 中设置这些工具可以带来更好的开发体验,代码保存时自动格式化,并即时反馈 Lint 问题。

Dart Code Metrics

移动端应用使用 DCM(Dart Code Metrics)进行 Lint 检查和指标计算。请参考 入门指南 了解 DCM 的设置详情。

注意:不需要激活许可证。

VSCode

安装 FlutterDCMPrettierESLintSvelte 扩展。这些扩展列在 .vscode 下的 extensions.json 文件中,应该会显示为工作区推荐项。

以下是我们使用的设置,它们应该作为工作区设置激活(settings.json):

settings.json
{
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[dart]": {
"editor.defaultFormatter": "Dart-Code.dart-code",
"editor.formatOnSave": true,
"editor.selectionHighlight": false,
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.suggestSelection": "first",
"editor.tabCompletion": "onlySnippets",
"editor.wordBasedSuggestions": "off"
},
"[javascript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[svelte]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "svelte.svelte-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[typescript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"cSpell.words": ["immich"],
"editor.formatOnSave": true,
"eslint.validate": ["javascript", "svelte"],
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
},
"svelte.enable-ts-plugin": true,
"typescript.preferences.importModuleSpecifier": "non-relative"
}