-
-
Notifications
You must be signed in to change notification settings - Fork 76
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
fix(Import-PSDependModule): Sanitize version string used for Import-Module #140
base: master
Are you sure you want to change the base?
fix(Import-PSDependModule): Sanitize version string used for Import-Module #140
Conversation
…odule This commit fixes one particular issue out of two identified issues. The first identified issue is that when initially "getting" a dependency, it does not seem to be imported. (I may be mistaken on this point, but read on.) The second issue, and the one this commit addresses, is that upon a subsequent run of PSDepend, the now "installed" module is attempted to be imported, and this fails in the case of modules whose PSDepend specification's version string includes a pre-release version tag. For example, the following spec: ```powershell @{ 'PSResourceGet' = @{ Name = 'Micrsooft.PowerShell.PSResourceGet' Version = 'latest' Parameters = @{ AllowPreRelease = $true } } } ``` The first time you run PSDepend, everything "works" fine. The reason I say that an "install" is preformed but not an import is because there are no errors when running this thi ferist time. But using this same configuration, running PSDepend a subsequent time results in the following error: ```text Checking for and installing the latest versions of the build system dependencies... WARNING: Access to the path 'D:\src\git\MyProject\build\deps\Microsoft.PowerShell.PSResourceGet\0.5.24' is denied. Save-Package: Unable to save the module 'Microsoft.PowerShell.PSResourceGet'. Import-Module: C:\Users\me\Documents\PowerShell\Modules\PSDepend\0.3.8\Private\Import-PSDependModule.ps1:21 Line | 21 | Import-Module @importParams | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ | The specified module 'D:\src\git\MyProject\build\deps\Microsoft.PowerShell.PSResourceGet' was not loaded because no valid module | file was found in any module directory. ``` The issue here is that now that the module is "installed", the version string, as specified in the PSDepend spec, is passed directly to Import-Module via Import-PSDependModule. It is necessary to sanitize the version string to remove any pre-release tags since Import-Module doesn't know anything about pre-release versions. The RquiredVersion parameter is a `System.Version` from the .NET BCL and is a Microsoft-proprietary version number format, not a SemVer string. This commit fixes this subsequent "import issue".
One could argue that this change should be hoisted up to |
The first error that is reported is |
@johlju, Yes, you are correct, but that's because PowerShell has no idea about pre-release versions. The If you install a prerelease version, let's say MyModule, version 2.0.0-preview1, here's the directory structure you will find of the installed module:
Notice the folder for the version--there is no pre-release tag there. |
Yes, correct. The preview release string is in the module manifest. |
Exactly. So, because PSDepend was passing the full SemVer version string as the Looking at PowerShell Core, I don't see that that has changed. One thing I want to research once more, is it possible to specify a pre-release version string in a full "module declaration" when importing? But IIRC, I don't believe there is. |
Per your other comment regarding |
This commit fixes one particular issue out of two identified issues.
The first identified issue is that when initially "getting" a dependency, it does not seem to be imported. (I may be mistaken on this point, but read on.) The second issue, and the one this commit addresses, is that upon a subsequent run of PSDepend, the now "installed" module is attempted to be imported, and this fails in the case of modules whose PSDepend specification's version string includes a pre-release version tag.
For example, the following spec:
The first time you run PSDepend, everything "works" fine. The reason I say that an "install" is performed but not an import is because there are no errors when running this the first time. But using this same configuration, running PSDepend a subsequent time results in the following error:
The issue here is that now that the module is "installed", the version string, as specified in the PSDepend spec, is passed directly to Import-Module via Import-PSDependModule. It is necessary to sanitize the version string to remove any pre-release tags since Import-Module doesn't know anything about pre-release versions. The RquiredVersion parameter is a
System.Version
from the .NET BCL and is a Microsoft-proprietary version number format, not a SemVer string.This commit fixes this subsequent "import issue".
Fixes #132