Paket icon indicating copy to clipboard operation
Paket copied to clipboard

Paket fails to install nugets with paths longer than MAX_PATH

Open ylatuya opened this issue 8 years ago • 14 comments

Description

paket restore fails with PathTooLong when installing the package runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl. This package is included by NETStandard.Library package

This bug seems to have been addressed in #949 but this seems another use case that is not handled correctly.

Repro steps

  1. Create an empty project in a directory path long enough eg: C:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\

  2. Create a packet.dependencies with the package NETStandard.Library

  3. Run paket install

Expected behavior

The command detects that the path is too long and shortens the package ID

Actual behavior

The command fails with PathTooLong

Known workarounds

None

Logs

` Paket version 5.113.1 paket.local override: nuget Couchbase.Lite.LM group Main -> /vas-nightly_windows_windows_x86/dist/windows_x86/share/nuget paket.local override: nuget Couchbase.Lite.Storage.SystemSQLite.LM group Main -> /vas-nightly_windows_windows_x86/dist/windows_x86/share/nuget paket.local override: nuget Sparkle group Main -> /vas-nightly_windows_windows_x86/dist/windows_x86/share/nuget paket.local override: nuget WebKit group Main -> /vas-nightly_windows_windows_x86/dist/windows_x86/share/nuget paket.local override: nuget Wibu group Main -> /vas-nightly_windows_windows_x86/dist/windows_x86/share/nuget paket.local override: nuget EPPlus.LM group Main -> /vas-nightly_windows_windows_x86/dist/windows_x86/share/nuget Something went wrong while downloading runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Message: Path too long: z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\packages\runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.1.nupkg ==> Trying again Something went wrong while downloading runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Message: Path too long: z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\packages\runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.1.nupkg ==> Trying again Downloading runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Downloading runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Something went wrong while downloading runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Message: Path too long: z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\packages\runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.1.nupkg ==> Last trial Downloading runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Something went wrong while downloading runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Message: Path too long: z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\packages\runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.1.nupkg ==> Last trial Downloading runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl 4.3.1 Performance:

  • Disk IO: 1 minute, 52 seconds
  • Average Download Time: 560 milliseconds
  • Number of downloads: 4
  • Average Request Time: 901 milliseconds
  • Number of Requests: 4
  • Runtime: 33 seconds Paket failed with -> PathTooLongException: Path too long: z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\packages\runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.1.nupkg -> PathTooLongException: Path too long: z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master\packages\runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.1.nupkg -> PathTooLongException: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. make[3]: *** [restore] Error 1 `

ylatuya avatar Oct 10 '17 08:10 ylatuya

I fear you need to reduce z:\longomatch-build_windows_windows_x86\sources\windows_x86\lm-protected-git-master

forki avatar Oct 10 '17 08:10 forki

We tried tackling this problem time and time again and someone is always complaining or the change is very intrusive (like https://github.com/fsprojects/Paket/pull/2584). So we welcome suggestions otherwise we don't really know what we can do.

We have the same problem in AppVeyor and never found a viable solution. Please help ;)

matthid avatar Oct 10 '17 18:10 matthid

I understand perfectly the issue can be hard to tackle from Paket's side since it's a combination of several external issues:

  • The lack of support in nuget to define platform and architecture for packages providing native dependencies so people need to include it in the package id.
  • The fact that some package maintainers use very long names for packages (sometimes caused by the first issue).
  • The 90's limitation of MAX_PATH which is absurd for modern file systems and operating systems.

A possible solution that would work for most people would be the option to override the package id with an alias: alias runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl package_alias: ro132x64nSSCO

This solution would imply explicitly changing the package id with an alias so current users wouldn't be affected, but it wouldn't work out of the box for most people since it would imply having to provide the overrides for all packages with long names.

ylatuya avatar Oct 17 '17 07:10 ylatuya

Is this problem related to the .NET framework used ? In this case, using .NET framework version >= 4.6.2 should solve this, as MAX_PATH limitation seems to be finally fixed.

sgallou avatar Mar 27 '19 14:03 sgallou

In this case, using .NET framework version >= 4.6.2 should solve this, as MAX_PATH limitation seems to be finally fixed.

UP PLEASE ! :)

theoandry avatar May 10 '19 07:05 theoandry

I couldn't believe my eyes when I ran into this issue.

dustinlacewell avatar Jul 19 '19 18:07 dustinlacewell

We had same issue with PathTooLongException : -> PathTooLongException: Path too long: D:\APP\AzureDevOpsAgents\Y35286.6\_work\_tool\dncs\2.1.302\x64\sdk\NuGetFallbackFolder\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl\4.3.3\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.3.nupkg In our case updating from 5.177.1 to 5.241.5 resolved our issue.

PavelA85 avatar Jan 03 '20 07:01 PavelA85

I can confirm this. I had a PathTooLongException (while probing c:\Program Files\dotnet\sdk\NuGetFallbackFolder\ during install of a nuget with a long id) with 5.181.1, which is gone in 5.219.0

jbaehr avatar Feb 25 '20 14:02 jbaehr

An update to my last comment: Only if the symptom is related to the NuGetFallbackFolder updating to a more recent Paket version helps. In any case that's just a hint that you're dancing on a knife's edge. In other environments we still get PathTooLongExceptions, now of this kind: C:\Users\some-long-username\.nuget\packages\some-long-package-id\some-version-with-long-prelrelease-tag\some-long-package-id.some-version-with-long-prelrelease-tag.nupkg

Luckily, we're in charge of the packages in question, so we can work around by shortening package-ids and pre-release labels.

jbaehr avatar Feb 26 '20 10:02 jbaehr

Still no solution to this 80's Windows limitation ? ? ?

sgallou avatar Oct 09 '20 08:10 sgallou

Just a quick note to express interest in getting this fixed. I'm having a real hard time using GitHub actions with a self-hosted runner now because github actions checks out my code into .../_work/long-repo-name/long-repo-name and when paket goes to restore NuGet dependencies I get paths like C:\actions-runner\_work\long-repo-name\long-repo-name\packages\test\runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.3.nupkg which paket can't handle.

I'm targeting .NET 5.

NightWatchman avatar Nov 09 '21 23:11 NightWatchman

@NightWatchman I'm not sure if you are aware of storage: none option in paket.dependencies and also if your project may be dependent on the nuget packages landing in ./packages/.

If the later answer is "it doesn't depend on that location", switching to storage: none will remove the long prefix, and the nuget packages end up just once in the cache, paket resolving it automatically from there rather than copying under ./packages.

smoothdeveloper avatar Nov 10 '21 07:11 smoothdeveloper

Thanks for the advice! I'm targeting .NET 5, soon to be .NET 6, with no odd custom references, so this worked just fine for me.

NightWatchman avatar Nov 10 '21 17:11 NightWatchman

Bug still opened. Cannot build.

System.IO.DirectoryNotFoundException: Could not find a part of the path '...\dependencies\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl\4.3.0\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.nuspec'

I'd like to know who's the guy who choose such a lovely name.

TheDuQe avatar Sep 14 '23 15:09 TheDuQe