medz / prisma-dart

Prisma Client Dart is an auto-generated type-safe ORM. It uses Prisma Engine as the data access layer and is as consistent as possible with the Prisma Client JS/TS APIs.
https://prisma.pub
BSD 3-Clause "New" or "Revised" License
436 stars 29 forks source link

ProcessException: Permission denied on MacOS Sonoma 14.1.1 macos app #372

Open farellsujanto opened 4 weeks ago

farellsujanto commented 4 weeks ago

I'm developing windows & macos app, the windows one is already running well, but I got some problem when building the macos app. Already doing chmod +x & 777 on the entire project & builds but still not working.

I'm using orm v4.1.0

I got this error

flutter: ProcessException: Permission denied
  Command: ./prisma/prisma-query-engine --enable-metrics --enable-open-telemetry --enable-raw-queries --port 0 --datamodel Ly8gVGhpcyBpcyB5b3VyIFByaXNtYSBzY2hlbWEgZmlsZSwKLy8gbGVhcm4gbW9yZSBhYm91dCBpdCBpbiB0aGUgZG9jczogaHR0cHM6Ly9wcmlzLmx5L2QvcHJpc21hLXNjaGVtYQoKZ2VuZXJhdG9yIGNsaWVudCB7CiAgcHJvdmlkZXIgPSAiZGFydCBydW4gb3JtIgogIG91dHB1dCAgID0gIi4uL2xpYi9zcmMvcHJpc21hX2NsaWVudCIKfQoKZGF0YXNvdXJjZSBkYiB7CiAgcHJvdmlkZXIgPSAicG9zdGdyZXNxbCIKICB1cmwgICAgICA9IGVudigiREFUQUJBU0VfVVJMIikKfQoKZW51bSBVc2VyUm9sZSB7CiAgU1VQRVJfQURNSU4KICBBRE1JTgp9Cgptb2RlbCBVc2VyIHsKICBpZCAgICAgICBJbnQgICAgICBAaWQgQGRlZmF1bHQoYXV0b2luY3JlbWVudCgpKQogIHVzZXJuYW1lIFN0cmluZyAgIEB1bmlxdWUKICBwYXNzd29yZCBTdHJpbmcKICBzYWx0ICAgICBTdHJpbmcKICByb2xlICAgICBVc2VyUm9sZQogIGVuYWJsZWQgIEJvb2xlYW4gIEBkZWZhdWx0KHRydWUpCgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAp9Cgptb2RlbCBDdXN0b21lciB7CiAgaWQgICAgICBJbnQgICAgIEBpZCBAZGVmYXVsdChhdXRvaW5jcmVtZW50KCkpCiAgbmFtZSAgICBTdHJpbmcKICBhZGRyZXNzIFN0cmluZwogIHBob25lICAgU3RyaW5nCiAgZW5hYmxlZCBCb29sZWFuIEBkZWZhdWx0KHRydWUpCgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAoKICBzYWxlc1JlcG9ydHMgU2FsZXNSZXBvcnRbXQp9Cgptb2RlbCBQcm9kdWN0IHsKICBpZCAgICAgICAgICAgSW50ICAgICBAaWQgQGRlZmF1bHQoYXV0b2luY3JlbWVudCgpKQogIG5hbWUgICAgICAgICBTdHJpbmcKICBsb3dlc3RQcmljZSAgSW50CiAgaGlnaGVzdFByaWNlIEludAogIGVuYWJsZWQgICAgICBCb29sZWFuIEBkZWZhdWx0KHRydWUpCgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAoKICBzdG9ja3MgU3RvY2tbXQp9Cgptb2RlbCBXYXJlaG91c2UgewogIGlkICAgICAgIEludCAgICAgQGlkIEBkZWZhdWx0KGF1dG9pbmNyZW1lbnQoKSkKICBuYW1lICAgICBTdHJpbmcKICBsb2NhdGlvbiBTdHJpbmcKICBlbmFibGVkICBCb29sZWFuIEBkZWZhdWx0KHRydWUpCgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAoKICBzYWxlc21hbnMgU2FsZXNtYW5bXQoKICBzYWxlc1JlcG9ydHMgU2FsZXNSZXBvcnRbXQoKICBzb3VyY2VXYXJlaG91c2VzIFdhcmVob3VzZVRyYW5zcG9ydFJlcG9ydFtdIEByZWxhdGlvbigiU291cmNlV2FyZWhvdXNlIikKICB0YXJnZXRXYXJlaG91c2VzIFdhcmVob3VzZVRyYW5zcG9ydFJlcG9ydFtdIEByZWxhdGlvbigiVGFyZ2V0V2FyZWhvdXNlIikKCiAgc3RvY2tzIFN0b2NrW10KfQoKbW9kZWwgU2FsZXNtYW4gewogIGlkICAgICAgSW50ICAgICBAaWQgQGRlZmF1bHQoYXV0b2luY3JlbWVudCgpKQogIG5hbWUgICAgU3RyaW5nCiAgZW5hYmxlZCBCb29sZWFuIEBkZWZhdWx0KHRydWUpCgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAoKICB3YXJlaG91c2UgICBXYXJlaG91c2UgQHJlbGF0aW9uKGZpZWxkczogW3dhcmVob3VzZUlkXSwgcmVmZXJlbmNlczogW2lkXSkKICB3YXJlaG91c2VJZCBJbnQKCiAgc2FsZXNSZXBvcnRzIFNhbGVzUmVwb3J0W10KfQoKbW9kZWwgU2FsZXNQcm9kdWN0IHsKICBpZCAgICAgICAgICAgSW50ICAgIEBpZCBAZGVmYXVsdChhdXRvaW5jcmVtZW50KCkpCiAgbmFtZSAgICAgICAgIFN0cmluZwogIHNlbGxpbmdQcmljZSBJbnQKICBxdHkgICAgICAgICAgSW50CiAgcmV0dXJuZWQgICAgIEludCAgICBAZGVmYXVsdCgwKQoKICBjcmVhdGVkQXQgRGF0ZVRpbWUgQGRlZmF1bHQobm93KCkpCiAgdXBkYXRlZEF0IERhdGVUaW1lIEB1cGRhdGVkQXQKCiAgc2FsZXNSZXBvcnQgICBTYWxlc1JlcG9ydD8gQHJlbGF0aW9uKGZpZWxkczogW3NhbGVzUmVwb3J0SWRdLCByZWZlcmVuY2VzOiBbaWRdKQogIHNhbGVzUmVwb3J0SWQgSW50PwoKICBwcm9kdWN0SWQgSW50CgogIHdhcmVob3VzZVRyYW5zcG9ydFJlcG9ydCAgIFdhcmVob3VzZVRyYW5zcG9ydFJlcG9ydD8gQHJlbGF0aW9uKGZpZWxkczogW3dhcmVob3VzZVRyYW5zcG9ydFJlcG9ydElkXSwgcmVmZXJlbmNlczogW2lkXSkKICB3YXJlaG91c2VUcmFuc3BvcnRSZXBvcnRJZCBJbnQ/Cn0KCm1vZGVsIFNhbGVzUmVwb3J0IHsKICBpZCAgICAgIEludCAgICAgQGlkIEBkZWZhdWx0KGF1dG9pbmNyZW1lbnQoKSkKICBlbmFibGVkIEJvb2xlYW4gQGRlZmF1bHQodHJ1ZSkKCiAgcGFpZCBJbnQgICAgIEBkZWZhdWx0KDApCiAgZGVzYyBTdHJpbmc/CgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAoKICB3YXJlaG91c2UgICBXYXJlaG91c2UgQHJlbGF0aW9uKGZpZWxkczogW3dhcmVob3VzZUlkXSwgcmVmZXJlbmNlczogW2lkXSkKICB3YXJlaG91c2VJZCBJbnQKCiAgc2FsZXNtYW4gICBTYWxlc21hbj8gQHJlbGF0aW9uKGZpZWxkczogW3NhbGVzbWFuSWRdLCByZWZlcmVuY2VzOiBbaWRdKQogIHNhbGVzbWFuSWQgSW50PwoKICBjdXN0b21lciAgIEN1c3RvbWVyPyBAcmVsYXRpb24oZmllbGRzOiBbY3VzdG9tZXJJZF0sIHJlZmVyZW5jZXM6IFtpZF0pCiAgY3VzdG9tZXJJZCBJbnQ/CgogIHNhbGVzUHJvZHVjdHMgU2FsZXNQcm9kdWN0W10KfQoKbW9kZWwgV2FyZWhvdXNlVHJhbnNwb3J0UmVwb3J0IHsKICBpZCAgICAgIEludCAgICAgQGlkIEBkZWZhdWx0KGF1dG9pbmNyZW1lbnQoKSkKICBlbmFibGVkIEJvb2xlYW4gQGRlZmF1bHQodHJ1ZSkKCiAgcGFpZCBJbnQgICAgIEBkZWZhdWx0KDApCiAgZGVzYyBTdHJpbmc/CgogIGNyZWF0ZWRBdCBEYXRlVGltZSBAZGVmYXVsdChub3coKSkKICB1cGRhdGVkQXQgRGF0ZVRpbWUgQHVwZGF0ZWRBdAoKICB3YXJlaG91c2UgICBXYXJlaG91c2UgQHJlbGF0aW9uKCJTb3VyY2VXYXJlaG91c2UiLCBmaWVsZHM6IFt3YXJlaG91c2VJZF0sIHJlZmVyZW5jZXM6IFtpZF0pCiAgd2FyZWhvdXNlSWQgSW50CgogIHRhcmdldFdhcmVob3VzZSAgIFdhcmVob3VzZSBAcmVsYXRpb24oIlRhcmdldFdhcmVob3VzZSIsIGZpZWxkczogW3RhcmdldFdhcmVob3VzZUlkXSwgcmVmZXJlbmNlczogW2lkXSkKICB0YXJnZXRXYXJlaG91c2VJZCBJbnQKCiAgc2FsZXNQcm9kdWN0cyBTYWxlc1Byb2R1Y3RbXQp9Cgptb2RlbCBTdG9jayB7CiAgaWQgIEludCBAaWQgQGRlZmF1bHQoYXV0b2luY3JlbWVudCgpKQogIHF0eSBJbnQgQGRlZmF1bHQoMCkKCiAgY3JlYXRlZEF0IERhdGVUaW1lIEBkZWZhdWx0KG5vdygpKQogIHVwZGF0ZWRBdCBEYXRlVGltZSBAdXBkYXRlZEF0CgogIHByb2R1Y3QgICBQcm9kdWN0IEByZWxhdGlvbihmaWVsZHM6IFtwcm9kdWN0SWRdLCByZWZlcmVuY2VzOiBbaWRdKQogIHByb2R1Y3RJZCBJbnQKCiAgd2FyZWhvdXNlICAgV2FyZWhvdXNlIEByZWxhdGlvbihmaWVsZHM6IFt3YXJlaG91c2VJZF0sIHJlZmVyZW5jZXM6IFtpZF0pCiAgd2FyZWhvdXNlSWQgSW50Cn0K --engine-protocol json --overwrite-datasources W3sibmFtZSI6ImRiIiwidXJsIjoicG9zdGdyZXM6Ly9wb3N0Z3Jlcy52eWZrbWZpZGhpcHFxbXZld2l0bTpqSnVyYWdhbjIzMDZAYXdzLTAtYXAtc291dGhlYXN0LTEucG9vbGVyLnN1cGFiYXNlLmNvbTo1NDMyL3Bvc3RncmVzIn1d

Here is the flutter doctor result

[✓] Flutter (Channel stable, 3.22.1, on macOS 14.1.1 23B81 darwin-arm64, locale en-ID)
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for more details.
[✓] Xcode - develop for iOS and macOS (Xcode 15.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2023.1)
[✓] VS Code (version 1.85.1)
[✓] VS Code (version 1.85.1)
[✓] Connected device (4 available)
[✓] Network resources

On release build its forced close but in debug build I got those error log, can you help me to solve this? Thanks!

farellsujanto commented 4 weeks ago

I'm using MacOS Sonoma 14.1.1 M1 chip

medz commented 4 weeks ago

chmod +x priama-query-engine

medz commented 4 weeks ago

You don't need to add permissions to the whole project. I just experimented with it. I just need to add x permissions to the engine.

farellsujanto commented 4 weeks ago

Its still not working for me. Do you need to have admin acces on your mac device's user account? Because my user is not an administrator

medz commented 4 weeks ago

@farellsujanto Is your project directory and running directory in your user directory? If not, then this is a matter of strict authority. You can either use the administrator account to authorize x permissions or run under your user directory.

farellsujanto commented 3 weeks ago

I think my problem is, I don't know which prisma-query-engine is called on the app, because when I delete all prisma-query-engine from the project directory it still says Permission denied but there is no any of the engine remaining.

Is it possible to specify which prisma-query-engine location to be used on the app?

medz commented 3 weeks ago

@farellsujanto

image

It will search three directories:

$PWD $PWD/prisma $PWD/.dart_tool

Engine files should exist in these three locations, otherwise an error of not finding the engine will be thrown instead of a permission error.

farellsujanto commented 3 weeks ago

I've found something strange, my project location is at /Users/username/Desktop/app_name, then I've searched the whole device for prisma-query-engine and I've found one on /Users/username/Library/Containers/com.example.appName/Data/prisma

When I tried to delete it it shows another error

Exception: No query engine binary found (prisma-query-engine) in [/Users/username/Library/Containers/com.example.appName/Data, /Users/username/Library/Containers/com.example.appName/Data/prisma, /Users/username/Library/Containers/com.example.appName/Data/.dart_tool]

Then I restore the deleted prisma-query-engine and add chmod +x to it, but it gives me another error

ProcessException: Operation not permitted

Just like what is reported on #326, I think its better if we have some freedom to use which prisma-query-engine that we wanted to use.

medz commented 3 weeks ago

@farellsujanto Thanks for finding the key issue. I'm working on it, please pay attention to 👉 #379 and #328. I've done it iOS and Android platform.

The temporary solution is usually:

  1. Upgrade orm to 4.2 or higher

  2. Use PrismaClient.use factory to create the client

  3. Import BinaryEngine from package:orm/engines/binary.dart to re-specify the query engine path.

Notes: I'm working on the macOS integration of Flutter and orm normally, and I can directly rely on orm_flutter to solve this problem when I'm done.

medz commented 3 weeks ago

In addition, the root cause of this problem is that the engine is included in the app's data directory. Due to macOS's permission control, the commands in it cannot be run directly from the outside. You can put the binary engine into flutter assets and write it to the system temporary directory during the startup phase, and then run it.

farellsujanto commented 3 weeks ago

Yeah I confirmed this is because of Directory.current on macos app is different than other platform due to the strict rules. I'm able to solve my issue with your suggestions above.

I've also found out that you don't need to use the temporary solution that you gave above by removing the app sandboxing on XCode. I don't know yet the side effect of removing the sandboxing but it works fine without any changes on the code.