@@ -141,7 +141,7 @@ func (i *Install) Run(params Params) (rerr error) {
141141 }
142142
143143 // Resolve requirements
144- reqs , err = i .resolveRequirements (params .Packages , ts , languages )
144+ reqs , err = i .resolveRequirements (params .Packages , ts , languages , params . Timestamp . Dynamic () )
145145 if err != nil {
146146 return errs .Wrap (err , "Unable to resolve requirements" )
147147 }
@@ -153,7 +153,7 @@ func (i *Install) Run(params Params) (rerr error) {
153153
154154 // Prepare updated buildscript
155155 script := oldCommit .BuildScript ()
156- if err := prepareBuildScript (script , reqs , ts ); err != nil {
156+ if err := prepareBuildScript (script , reqs , ts , params . Timestamp . Dynamic () ); err != nil {
157157 return errs .Wrap (err , "Could not prepare build script" )
158158 }
159159
@@ -181,7 +181,7 @@ type errNoMatches struct {
181181}
182182
183183// resolveRequirements will attempt to resolve the ingredient and namespace for each requested package
184- func (i * Install ) resolveRequirements (packages captain.PackagesValue , ts time.Time , languages []model.Language ) (requirements , error ) {
184+ func (i * Install ) resolveRequirements (packages captain.PackagesValue , ts time.Time , languages []model.Language , dynamic bool ) (requirements , error ) {
185185 failed := []* requirement {}
186186 reqs := []* requirement {}
187187 for _ , pkg := range packages {
@@ -191,6 +191,13 @@ func (i *Install) resolveRequirements(packages captain.PackagesValue, ts time.Ti
191191 req .Resolved .Namespace = pkg .Namespace
192192 }
193193
194+ // When using dynamic imports, the packages may not yet exist in the inventory, so searching
195+ // for them is fruitless. Just pass them along.
196+ if dynamic {
197+ reqs = append (reqs , req )
198+ continue
199+ }
200+
194201 // Find ingredients that match the pkg query
195202 ingredients , err := model .SearchIngredientsStrict (pkg .Namespace , pkg .Name , false , false , & ts , i .prime .Auth ())
196203 if err != nil {
@@ -274,7 +281,9 @@ func resolveVersion(req *requirement) error {
274281 }
275282
276283 // Verify that the version provided can be resolved
277- if versionRe .MatchString (version ) {
284+ // Note: if the requirement does not have an ingredient, it is being dynamically imported, so
285+ // we cannot resolve its versions yet.
286+ if versionRe .MatchString (version ) && req .Resolved .ingredient != nil {
278287 match := false
279288 for _ , knownVersion := range req .Resolved .ingredient .Versions {
280289 if knownVersion .Version == version {
@@ -340,8 +349,14 @@ func (i *Install) renderUserFacing(reqs requirements) {
340349 i .prime .Output ().Notice ("" )
341350}
342351
343- func prepareBuildScript (script * buildscript.BuildScript , requirements requirements , ts time.Time ) error {
352+ func prepareBuildScript (script * buildscript.BuildScript , requirements requirements , ts time.Time , dynamic bool ) error {
344353 script .SetAtTime (ts , true )
354+
355+ err := script .SetDynamic (dynamic )
356+ if err != nil {
357+ return errs .Wrap (err , "Unable to update solve function" )
358+ }
359+
345360 for _ , req := range requirements {
346361 requirement := types.Requirement {
347362 Namespace : req .Resolved .Namespace ,
0 commit comments