-
-
Notifications
You must be signed in to change notification settings - Fork 13.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
flutter build ios
fails
#243448
Comments
I have this issue too, seems the files should be placed in a 'cache' folder inside flutter store object, there's no way to create it incrementally, and the 'cache' folder can not be changed. |
This patch should take care of the naming issue: diff --git a/pkgs/development/compilers/flutter/wrapper.nix b/pkgs/development/compilers/flutter/wrapper.nix
index 5685ddebd78..23d8441be36 100644
--- a/pkgs/development/compilers/flutter/wrapper.nix
+++ b/pkgs/development/compilers/flutter/wrapper.nix
@@ -64,7 +64,7 @@ let
'';
mkPlatformArtifactLinkCommand = { artifact, os, architecture, variant ? null }:
let
- artifactDirectory = "${os}-${architecture}${lib.optionalString (variant != null) "-${variant}"}";
+ artifactDirectory = "${os}${lib.optionalString (architecture != null && architecture != "") "-${architecture}"}${lib.optionalString (variant != null) "-${variant}"}";
in
''
mkdir -p $out/artifacts/engine/${artifactDirectory} EDIT: Outdated. Not needed anymore. |
There's another issue for iOS debugging. In the
but the engine files are located in According to the source code, flutter will use the cache correctly if there's a |
Originally, the artifacts were symlinked to the Flutter derivation. However, due to the need to recompile Flutter and depend on Nix store optimizations to save space every time the artifacts changed, it was modified in #240715 to retrieve the cache from an environment variable instead. This change removed the need to rebuild the Flutter derivation. Perhaps we should patch the 2 artifacts_dir = File.join(ENV['FLUTTER_CACHE_DIR'], 'artifacts', 'engine') |
I'm not sure if it's a good idea to patch the code to podhelper.rb, just don't know if there's other place still trying to find fro the original artifact location, but at least it should fix the current error. |
What if we instead join Flutter and artifacts derivations at the root level. That way the original folder structure would be preserved, so relative paths should work normally. Something like this. I don't have access to a MacOS machine right now, so I haven't had the chance to see if this resolves the issue. |
IIRC symlinkJoining the flutter derivation with another derivation that adds files to bin/cache doesn't work. |
Maybe setting the FLUTTER_ROOT environment variable to the joined derivation would work. |
I tested it today and I don't even get to the Automatically signing iOS for device deployment using specified development team in Xcode project: ...
Running Xcode build...
Xcode build done. 12.8s
Failed to build iOS app
Error (Xcode): Target release_unpack_ios failed: Exception: Failed to codesign ...project/build/ios/Release-iphoneos/Flutter.framework/Flutter with
identity ... I think the problem is caused by the fact that the If I try to build without singing @IanLuo what steps do you use? |
I got this problem after upgrading flutter and upgrading some packages,
|
Seeing this on aarch64-darwin trying to build https://github.com/CCExtractor/taskwarrior-flutter No luck manually setting the build cache: export FLUTTER_CACHE_DIR=$(nix build --print-out-paths --no-link ~/git/nixpkgs#flutter)/bin/cache When I run
|
Bumping this issue: When following the above instructions I am getting the error: Anyone having a workaround? Any fix envisioned? |
What I ended up doing is:
So far this approach just worked. Trying to do it properly is such an uphill battle, it's probably not worth it. Flutter wasn't really designed to be packaged. |
@brokenpylons thanks for your advice! It's a pity that flutter does not play well with nix. I wanted to do that in a new derivation, but did not succeeded ... how did you do it? Or did you go the Basically, I would like to
Many thanks! |
@patmuk I download the tarballs using flutterSource-x86_64-linux = pkgs.fetchurl {
url = "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.19.3-stable.tar.xz";
hash = "sha256-3bcSvlhiga/VGj+W2zaB+Z8kInggHgrjMiwDcG5ABK0=";
}; flutterSource-aarch64-darwin = pkgs.fetchurl {
url = "https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_arm64_3.19.3-stable.zip";
hash = "sha256-pT4Mdqill8MtPAY9QQ4XVw2lR1brz0CRDbS4MFufhuk=";
}; Then I have a linux and a macOS version of the unpack command, which unpacks the archive to the current directory. pkgs.writeShellApplication {
name = "unpack";
runtimeInputs = [ pkgs.xz pkgs.gnutar ];
text = ''
tar -xvf ${flutterSource-x86_64-linux} -C "$PWD"
'';
}; pkgs.writeShellApplication {
name = "unpack";
text = ''
unzip ${flutterSource-aarch64-darwin} -d "$PWD"
'';
}; I also have a derivation for the web build, which uses |
Many thanks, that worked! For anyone needing it: My ,/nix/flutter-local.nix:
my flake.nix:
|
Despite the local installation I am still getting these errors:
However, |
This issue has been mentioned on NixOS Discourse. There might be relevant details there: https://discourse.nixos.org/t/flutter-for-ios-setup-not-working/43130/4 |
Turned out, that |
This issue can be closed (I can't do that myself). |
The issue is not actually solved for flutter in nixpkgs, so I'll leave it open. |
@patmuk can your workaround be applied to the flutter package? |
No, sorry, I distracted a bit from the original issue. I used a workaround recommended from @brokenpylons: Have a mkShell in a flake download and install Flutter locally, not using the nix package. Using mkShellNoCC made this workaround work - but it is not a solution to the original issue. I am not deep enough into nix, but I believe it might not be that hard to create a local cash directory for flutter when nix-installing it? |
The issue is that flutter expects the cache directory to be inside the flutter root, they frequently refer to it using relative paths, for example link and link. This needs to be fixed upstream, trying to patch this would be like playing whack-a-mole. |
Created the issue at the upstream. Will look at on how hard it would it be to allow it to also first try an env variable for the binary cache location today. Even if they don't accept the patch maybe it could be useful. |
I tried that maybe a month ago. Once I fix my XCode, I will try that again today! |
@FlafyDev I'm aware. But as far as I can tell the artifacts are still stored in the nix store, right? |
Ups, not the "Flutter executable", but the "/cache/artifacts". |
@FlafyDev I guess you can then patch this build script to I think the correct approach is to get the cache out of the store, like @dvtkrlbs proposed. However there is a bunch of issues already open for this: And no progress was made so far... |
We are already doing it in one place in the code https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/compilers/flutter/patches/copy-without-perms.patch . It never broke so far(was created in Apr 2023 I think) and I don't see another way for solving that kind of problem.
I disagree. I believe artifacts shouldn't be downloaded at runtime and should be fetched together with Flutter when building it in Nix.
It does require a lot of work. but we already proved immutable Flutter is possible by having Flutter work great for building to Linux desktop, web, and Android (And maybe mac, never tested). And we also got |
I meant unsustainable in a sense that constant effort is required for the package to work. If flutter team decides to change how the build works there is a chance you will need to fix it again.
I wasn't aware of this, that's unfortunate. I assumed it was just files required for the build.
I attempted that as well. I got it to build, but the apk wasn't reproducible. Did you manage to solve this? |
Btw, I got my Xcode problem fixed (for anyone with the same issue: Redownload the runtime) and I would be ready to test, if needed. Though it looks like you guys already boiled it down :) |
Yeah that's a big downside and why we should minimize the amount of patches we add to the flutter package and upstream whatever we can.
Support it being worked at here #307983 I barely tested it but it seems flutter only needs to fetch gradle files(so (this is getting off topic tho lol) |
Btw if anyone want to work on this. I can create a lightweight macos vm and provide ssh/vnc access to it. |
I looked further on the issue and it seems like the necessary artifacts exists in flutter-wrapped but doesn't exist on flutter-unwrapped. Can't we just make sure that they exist in unwrapped? Simple folder diff with an downloaded sdk doesn't show distinct files. |
Do you mean flutter as the flutter-wrapped? I can't find a flutter-unwrapped ...
Comparing my locally-installed flutter with the nix package results in:
The contents of
It looks like the content depends on what is used in the project ... I agree that it would be best to have them immutably managed by nix, inside the flutter package or as extra packages ... but it might be quite complicated and maintenance heavy. Again, I am not deep enough into nix. Hope the diffs help! (If you need more/different things just ask!). |
@patmuk try -r flag with the diff command. i think the default flutter binary comes from flutter-wrapped. in my case apart from version difference every necessary artifact is prepared in the other folder. I will try a more complex project. |
Btw. I setup a macos vm on my macbook. I can't keep it open 24/7 but if any of the maintainers want to test I can share the device via tailscale and give credentials for vnc and ssh. |
Sure - sorry for the oversight!
Oh, I noticed now that I diffed 'unwrapped' - but Thus I can confirm:
|
Some diffs might be because of the version difference (local flutter: 3.19.5 vs nix flutter: 3.19.4). I will downgrade my local flutter to the same version and post a new |
here is the difference on the same version Details
unwrapped dir Details
|
Great! I got stuck in nix configuration, rewriting my flake to handle multiple versions ... |
That's the point actually
if we were to combine them into a single derivation we'd have to rebuild(or copy) flutter itself for every artifact combination. The issue is that when building for IOS it thinks the flutter root is the unwrapped derivation and not the wrapped derivation.(unlike any other build[web, linux, mac, android]) |
Ah, thanks for explaining!
Yes! That is weird.
It is not an env, maybe some default somewhere? printenv
|
Here are some diffs of a locally installed flutter (downloaded from https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_arm64_3.19.4-stable.zip and unziped) and the nix flutter wrapped: diff directories
diff -r
Is the nix flutter sourced for the same zip? Strange that the binaries differ.
it looks like there are not so many combinations? Meaning, instead of a single Anyways, that might solve the issue - but it is a workaround for flutter using the |
I just installed flutter from nixpkgs, I also got the
Is this issue still being worked on? What's happening? Is there a fix other than unpacking flutter tarball yourself and adding mkShellNoCC? |
In my understanding iOS does not work and after all my research I created a shellHook that loads Flutter via the official Tarball into my Workspace and checks if the correct xCode version is present on the system. I only manage Java, AndroidSdk, Ruby etc. in my projects Nix Flake. |
@Steffen70 did you mean “iOS doesn’t work without the workaround”? Is anyone working on that? |
@patmuk Yes, that's an even better workaround... this way, you also have a hash to verify the downloaded tarball. However, I'm not sure if anyone is currently working on it. I'll attend the Nix Switzerland Convention in Zurich and ask how this issue could be escalated within Nix. I'm fairly new to Nix, so I can't really say for certain. |
@Steffen70 I plan to write this up and publish my nix files ... maybe somebody has use of this :) Great that you will attend the Convention and ask! Many thanks! |
Can anyone with a Mac try #341470? |
I tested the changes form the PR #341470, and the issue seems to be resolved. I no longer encounter the artifacts error when building for iOS. Everything appears to be working as expected now. Thanks for the fix @phlip9 {
description = "A Nix Flake for Flutter mobile development and fastlane CI/CD";
inputs = {
# Use the unstable channel for the latest packages
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
# Stable channel for the latest NixOS release
# nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-23.11";
flake-utils.url = "github:numtide/flake-utils";
# Custom powershell modules
powershell_modules.url = "github:seventymx/powershell_modules";
flutter-pr.url = "github:phlip9/nixpkgs/phlip9/flutter324-fix-ios-macos-devenv";
};
outputs = { self, nixpkgs, flake-utils, powershell_modules, ... }@inputs:
flake-utils.lib.eachDefaultSystem (system:
let
unstable = import nixpkgs {
inherit system;
config = {
android_sdk.accept_license = true;
allowUnfree = true;
};
};
pr = import inputs.flutter-pr {
inherit system;
};
androidComposition = unstable.androidenv.composeAndroidPackages {
# API levels for Android 13 and 14
platformVersions = [ "31" "32" "33" "34" ];
buildToolsVersions = [ "30.0.3" "33.0.0" "34.0.0" ];
abiVersions = [ "x86_64" ];
includeEmulator = true;
includeSystemImages = true;
systemImageTypes = [ "google_apis_playstore" ];
includeExtras = [
"extras;google;gcm"
];
};
# TODO: Make it work on Apple Silicon - Currently only works on x86_64-linux
androidSdk = androidComposition.androidsdk;
hostPlatform = unstable.stdenv.hostPlatform.system;
appleInputs =
if builtins.elem hostPlatform ["aarch64-darwin" "x86_64-darwin"] then [
unstable.cocoapods
] else [ ];
in
{
devShell = unstable.mkShellNoCC {
buildInputs = [
unstable.git
androidSdk
unstable.jdk17
unstable.fastlane
unstable.ruby
unstable.powershell
pr.flutter
] ++ appleInputs;
|
Closing since #341470 got merged |
Sorry for being late - I can confirm it working on a Silicon Mac. |
Describe the bug
Building the IOS application fails. The
Flutter.xcframework
seems to be missing from the Nix generated$FLUTTER_ROOT/bin/cache
folder. The following error is reported:Steps To Reproduce
Steps to reproduce the behavior:
nix shell nixpkgs#flutter -c flutter create --org no.name.test ios_m1 --platform=ios
cd ios_m1
nix shell nixpkgs#flutter -c flutter build ios
nix shell nixpkgs#flutter -c flutter build ios
Notify maintainers
@devholic
@babariviere
@ericdallo
@FlafyDev
@gilice
@hacker1024
Metadata
The text was updated successfully, but these errors were encountered: