@@ -154,7 +154,14 @@ def format_requirement(
154154 else :
155155 fragment = fragment_string (ireq )
156156 extras = f"[{ ',' .join (sorted (ireq .extras ))} ]" if ireq .extras else ""
157- delimiter = "#" if extras and not fragment else ""
157+ # pip install needs different relpath formats, depending on extras and fragments:
158+ # https://github.com/jazzband/pip-tools/pull/1329#issuecomment-1056409415
159+ if fragment or not extras :
160+ prefix = "file:"
161+ delimiter = ""
162+ else :
163+ prefix = ""
164+ delimiter = "#"
158165 if not from_dir :
159166 line = (
160167 f"-e { path_to_url (ireq .local_file_path )} { fragment } { delimiter } { extras } "
@@ -163,9 +170,9 @@ def format_requirement(
163170 )
164171 else :
165172 try :
166- path_url = "file:" + os .path .relpath (
167- ireq . local_file_path , from_dir
168- ). replace ( os . path . sep , "/" )
173+ relpath = os .path .relpath ( ireq . local_file_path , from_dir ). replace (
174+ os . path . sep , "/"
175+ )
169176 except ValueError :
170177 # On Windows, a relative path is not always possible (no common ancestor)
171178 line = (
@@ -174,7 +181,9 @@ def format_requirement(
174181 else _build_direct_reference_best_efforts (ireq )
175182 )
176183 else :
177- line = f"{ '-e ' if ireq .editable else '' } { path_url } { fragment } { delimiter } { extras } "
184+ if not prefix and not relpath .startswith ("." ):
185+ prefix = "./"
186+ line = f"{ '-e ' if ireq .editable else '' } { prefix } { relpath } { fragment } { extras } "
178187
179188 if marker :
180189 line = f"{ line } ; { marker } "
0 commit comments