rules_python
rules_python copied to clipboard
requirements.update doesn't work on windows when requirements.in in a subpackage
Affected Rule
The issue is caused by the rule: compile_pip_requirements
Is this a regression?
Yes this regressed between: https://github.com/bazelbuild/rules_python/compare/0.18.0...0.19.0
Description
If you have a rule in a sub package (so it contains a directory separator) then on windows you will get an issue where it cannot find file path for requirements.txt.
Note: the slashes are the wrong direction for windows.
🔬 Minimal Reproduction
In 0.25.0 branch of rules_python
cd .\examples\pip_parse\
REM This works
bazel run requirements.update
mkdir bad
copy .\BUILD.bazel bad
copy .\requirements.in bad
copy .\requirements_lock.txt bad
REM This fails with Error: Could not open file 'bad/requirements_lock.txt': No such file or directory
bazel run //bad:requirements.update
🔥 Exception or Error
INFO: Running command line: bazel-bin/tools/thirdparty/requirements.update.exe tools/thirdparty/requirements.in tools/thirdparty/requirements.txt None None None //tools/thirdparty:requirements.update --allow-unsafe --no-reuse-hashes
Updating tools/thirdparty/requirements.txt
Traceback (most recent call last):
File "C:\Users\JAMESC~1\AppData\Local\Temp\Bazel.runfiles_gwh6jf4s\runfiles\rules_python\python\pip_install\tools\dependency_resolver\dependency_resolver.py", line 139, in
if not os.path.samefile(requirements_txt, requirements_txt_tree):
File "C:\Users\JAMESC~1\AppData\Local\Temp\Bazel.runfiles_gwh6jf4s\runfiles\python3_10_x86_64-pc-windows-msvc\lib\genericpath.py", line 100, in samefile
s1 = os.stat(f1)
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'tools/thirdparty/requirements.txt'
🌍 Your Environment
Operating System:
windows
Output of bazel version
:
Build label: 6.2.0
Build target: bazel-out/x64_windows-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue May 9 18:34:17 2023 (1683657257)
Build timestamp: 1683657257
Build timestamp as int: 1683657257
Rules_python version:
0.25.0
Anything else relevant? Same code works fine on macos and WSL.
I just experienced this bug as well.
I moved a project written on from Ubuntu Linux 22.04 to a Windows 10 machine. I wanted to test if calling "bazel run requirements.update" without the requirements_lock.txt file existing will result in Error in read: java.io.FileNotFoundException. It does. When I tried to re-create the file and run the command again, I got the following error:
Starting local Bazel server and connecting to it...
INFO: Invocation ID: 346f2cac-30e8-46be-a367-3b4e5ad0e2f5
INFO: Analyzed target //:requirements.update (61 packages loaded, 4166 targets configured).
INFO: Found 1 target...
Target //:requirements.update up-to-date:
bazel-bin/requirements.update.zip
bazel-bin/requirements.update.exe
INFO: Elapsed time: 164.462s, Critical Path: 10.80s
INFO: 7 processes: 5 internal, 2 local.
INFO: Build completed successfully, 7 total actions
INFO: Running command line: bazel-bin/requirements.update.exe pip_example/pypi/requirements.in pip_example/pypi/requirements_lock.txt //:requirements.update '--resolver=backtracking' --allow-unsafe --generate-hashes
Updating pypi/requirements_lock.txt
WARNING: --strip-extras is becoming the default in version 8.0.0. To silence this warning, either use --strip-extras to opt into the new default or use --no-strip-extras to retain the existing behavior.
Error: Could not open file 'pypi/requirements_lock.txt': No such file or directory
I thought it was an encoding/character set issue, but even copying the original code from the folder and trying to run it does not work.
In my project, the "requirements.in" and "requirements_lock.txt" files were both in a subfolder of the root directory. When I moved them to the root directory, it worked without any errors.
I am using Bazel version 7.1.1 and rules_python version 0.31.0 on both machines.