如何更改 Chocolatey 包的 $url 以进行安装
How can I alter a Chocolatey package's $url for install
TLDR 版本:我需要能够附加到巧克力包为其下载源指定的 URL 的末尾。
我正在尝试使用 Chocolatey 安装 Android-SDK 包,但我的过滤代理有问题(我无法控制其功能和提供)。代理被正确检测到,但它会阻止包含某些模式的 URLs 并发出 403 return(在这种情况下,这是因为 URL 是 .exe
)。所以 运行 choco install -y android-sdk
导致以下错误。
2015-03-12 15:14:47,639 [INFO ] - ============================================================
2015-03-12 15:14:47,664 [INFO ] - Chocolatey v0.9.9.2
2015-03-12 15:14:47,730 [INFO ] - Installing the following packages:
2015-03-12 15:14:47,753 [INFO ] - android-sdk
2015-03-12 15:14:47,754 [INFO ] - By installing you accept licenses for the packages.
2015-03-12 15:14:49,221 [INFO ] -
android-sdk v24.0.2
2015-03-12 15:14:50,525 [INFO ] - Using this proxyserver: xxx.xxx.xxx.xxx:xxxxx
2015-03-12 15:14:52,175 [INFO ] - Attempt to get headers for http://dl.google.com/android/installer_r24.0.2-windows.exe failed.
2015-03-12 15:14:52,175 [INFO ] - Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (403) Forbidden."
2015-03-12 15:14:52,180 [INFO ] - Downloading android-sdk 32 bit
2015-03-12 15:14:52,180 [INFO ] - from 'http://dl.google.com/android/installer_r24.0.2-windows.exe'
2015-03-12 15:14:52,213 [INFO ] - Using this proxyserver: xxx.xxx.xxx.xxx:xxxxx
2015-03-12 15:14:52,329 [ERROR] - Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (403) Forbidden."
2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3
2015-03-12 15:14:52,330 [ERROR] - + $res = $req.GetResponse();
2015-03-12 15:14:52,330 [ERROR] - + ~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-12 15:14:52,331 [ERROR] - + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
2015-03-12 15:14:52,331 [ERROR] - + FullyQualifiedErrorId : WebException
2015-03-12 15:14:52,354 [ERROR] - You cannot call a method on a null-valued expression.
2015-03-12 15:14:52,354 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:138 char:3
2015-03-12 15:14:52,355 [ERROR] - + $res.Close();
2015-03-12 15:14:52,356 [ERROR] - + ~~~~~~~~~~~~
2015-03-12 15:14:52,356 [ERROR] - + CategoryInfo : InvalidOperation: (:) [], RuntimeException
2015-03-12 15:14:52,357 [ERROR] - + FullyQualifiedErrorId : InvokeMethodOnNull
2015-03-12 15:14:54,374 [ERROR] - Chocolatey expected a file to be downloaded to
2015-03-12 15:14:54,375 [ERROR] - 'X:\Users\xxx\AppData\Local\Temp\chocolatey\android-sdk\android-sdkInstall.exe' but nothing exists at that
2015-03-12 15:14:54,375 [ERROR] - location.
2015-03-12 15:14:54,376 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-ChocolateyWebFile.ps1:148 char:24
2015-03-12 15:14:54,376 [ERROR] - + if (!($fi.Exists)) {{ throw "Chocolatey expected a file to be downloaded to `'$ ...
2015-03-12 15:14:54,377 [ERROR] - + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-12 15:14:54,377 [ERROR] - + CategoryInfo : OperationStopped: (Chocolatey expe... that location.:String) [], RuntimeException
2015-03-12 15:14:54,378 [ERROR] - + FullyQualifiedErrorId : Chocolatey expected a file to be downloaded to 'X:\Users\xxx\AppData\Local\Temp\cho
2015-03-12 15:14:54,378 [ERROR] - colatey\android-sdk\android-sdkInstall.exe' but nothing exists at that location.
2015-03-12 15:14:54,618 [ERROR] - android-sdk install not successful.
2015-03-12 15:14:54,621 [ERROR] - Error while running 'C:\ProgramData\chocolatey\lib\android-sdk\tools\chocolateyInstall.ps1'.
See log for details.
2015-03-12 15:14:56,643 [WARN ] -
Chocolatey installed 0/1 package(s). 1 package(s) failed.
See the log for details.
2015-03-12 15:14:56,643 [ERROR] - Failures:
2015-03-12 15:14:56,645 [ERROR] - - android-sdk
我可以使用包网页上列出的 chocolateyInstall.ps1
和 chocolateyUninstall.ps1
创建自己的包并更改 URL,但这会抵消使用包管理器的任何好处简化管理程序和依赖项的过程。
所以我想知道是否有某种方法可以简单地附加一个字符串,该字符串允许 URL 通过代理而不考虑文件扩展名(明确地说,我知道这个字符串是什么,我只是不知道如何将它附加到包指定的URL。
这不是一个完整的答案,我不确定这个答案安全性如何(就 Chocolatey 本身的更新而言),但它解决了我的紧迫问题使用 android-sdk 包。不幸的是,任何实现自己下载代码的包都会绕过这个 "fix".
我注意到错误日志中的一行将故障点之一突出显示为 2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3
,想知道我是否可以更改该 powershell 脚本中的 URL。在对附加字符串所需的精确转义进行了一些试验和错误之后,我设法让它下载了文件,但 header 检查仍然失败。
然后我检查了 helpers/functions/
目录中的其他文件,发现 Get-ChocolateyWebFile.ps1
似乎调用了 Get-WebFile.ps1
并且 header 检查是否它需要 SSL。
因此,我创建了一个新的 powershell 函数文件以在名为 Get-ProxyUrl
的函数中执行必要的 URL 重写,并将此行添加到 Get-ChocolateyWebFile.ps1
检查 32 位的部分之后/64bit URL 但在 header 之前检查 URL (我的版本 0.9.9.2 文件中的第 101 行)。
$url = Get-ProxyUrl($url)
然后我还将它添加到 Get-WebFile.ps1
中 Get-WebFile
函数定义的最开头,以捕获对该函数的任何直接调用。
因此,这将允许我修复任何使用 Install-ChocolateyPackage
、Get-ChocolateyWebFile
或 Get-WebFile
的包,但仍然会留下一些包 - 例如 JDK8 - 指定它们自己的文件下载代码仍然失败。
因此,更好的解决方案是从 Chocolatey 安装中捕获任何 URLs...可能唯一的方法是安装一个本地代理服务器,chocolatey 可以使用它来转换 URLs... =43=] 被传递之前
TLDR 版本:我需要能够附加到巧克力包为其下载源指定的 URL 的末尾。
我正在尝试使用 Chocolatey 安装 Android-SDK 包,但我的过滤代理有问题(我无法控制其功能和提供)。代理被正确检测到,但它会阻止包含某些模式的 URLs 并发出 403 return(在这种情况下,这是因为 URL 是 .exe
)。所以 运行 choco install -y android-sdk
导致以下错误。
2015-03-12 15:14:47,639 [INFO ] - ============================================================
2015-03-12 15:14:47,664 [INFO ] - Chocolatey v0.9.9.2
2015-03-12 15:14:47,730 [INFO ] - Installing the following packages:
2015-03-12 15:14:47,753 [INFO ] - android-sdk
2015-03-12 15:14:47,754 [INFO ] - By installing you accept licenses for the packages.
2015-03-12 15:14:49,221 [INFO ] -
android-sdk v24.0.2
2015-03-12 15:14:50,525 [INFO ] - Using this proxyserver: xxx.xxx.xxx.xxx:xxxxx
2015-03-12 15:14:52,175 [INFO ] - Attempt to get headers for http://dl.google.com/android/installer_r24.0.2-windows.exe failed.
2015-03-12 15:14:52,175 [INFO ] - Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (403) Forbidden."
2015-03-12 15:14:52,180 [INFO ] - Downloading android-sdk 32 bit
2015-03-12 15:14:52,180 [INFO ] - from 'http://dl.google.com/android/installer_r24.0.2-windows.exe'
2015-03-12 15:14:52,213 [INFO ] - Using this proxyserver: xxx.xxx.xxx.xxx:xxxxx
2015-03-12 15:14:52,329 [ERROR] - Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (403) Forbidden."
2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3
2015-03-12 15:14:52,330 [ERROR] - + $res = $req.GetResponse();
2015-03-12 15:14:52,330 [ERROR] - + ~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-12 15:14:52,331 [ERROR] - + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
2015-03-12 15:14:52,331 [ERROR] - + FullyQualifiedErrorId : WebException
2015-03-12 15:14:52,354 [ERROR] - You cannot call a method on a null-valued expression.
2015-03-12 15:14:52,354 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:138 char:3
2015-03-12 15:14:52,355 [ERROR] - + $res.Close();
2015-03-12 15:14:52,356 [ERROR] - + ~~~~~~~~~~~~
2015-03-12 15:14:52,356 [ERROR] - + CategoryInfo : InvalidOperation: (:) [], RuntimeException
2015-03-12 15:14:52,357 [ERROR] - + FullyQualifiedErrorId : InvokeMethodOnNull
2015-03-12 15:14:54,374 [ERROR] - Chocolatey expected a file to be downloaded to
2015-03-12 15:14:54,375 [ERROR] - 'X:\Users\xxx\AppData\Local\Temp\chocolatey\android-sdk\android-sdkInstall.exe' but nothing exists at that
2015-03-12 15:14:54,375 [ERROR] - location.
2015-03-12 15:14:54,376 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-ChocolateyWebFile.ps1:148 char:24
2015-03-12 15:14:54,376 [ERROR] - + if (!($fi.Exists)) {{ throw "Chocolatey expected a file to be downloaded to `'$ ...
2015-03-12 15:14:54,377 [ERROR] - + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-12 15:14:54,377 [ERROR] - + CategoryInfo : OperationStopped: (Chocolatey expe... that location.:String) [], RuntimeException
2015-03-12 15:14:54,378 [ERROR] - + FullyQualifiedErrorId : Chocolatey expected a file to be downloaded to 'X:\Users\xxx\AppData\Local\Temp\cho
2015-03-12 15:14:54,378 [ERROR] - colatey\android-sdk\android-sdkInstall.exe' but nothing exists at that location.
2015-03-12 15:14:54,618 [ERROR] - android-sdk install not successful.
2015-03-12 15:14:54,621 [ERROR] - Error while running 'C:\ProgramData\chocolatey\lib\android-sdk\tools\chocolateyInstall.ps1'.
See log for details.
2015-03-12 15:14:56,643 [WARN ] -
Chocolatey installed 0/1 package(s). 1 package(s) failed.
See the log for details.
2015-03-12 15:14:56,643 [ERROR] - Failures:
2015-03-12 15:14:56,645 [ERROR] - - android-sdk
我可以使用包网页上列出的 chocolateyInstall.ps1
和 chocolateyUninstall.ps1
创建自己的包并更改 URL,但这会抵消使用包管理器的任何好处简化管理程序和依赖项的过程。
所以我想知道是否有某种方法可以简单地附加一个字符串,该字符串允许 URL 通过代理而不考虑文件扩展名(明确地说,我知道这个字符串是什么,我只是不知道如何将它附加到包指定的URL。
这不是一个完整的答案,我不确定这个答案安全性如何(就 Chocolatey 本身的更新而言),但它解决了我的紧迫问题使用 android-sdk 包。不幸的是,任何实现自己下载代码的包都会绕过这个 "fix".
我注意到错误日志中的一行将故障点之一突出显示为 2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3
,想知道我是否可以更改该 powershell 脚本中的 URL。在对附加字符串所需的精确转义进行了一些试验和错误之后,我设法让它下载了文件,但 header 检查仍然失败。
然后我检查了 helpers/functions/
目录中的其他文件,发现 Get-ChocolateyWebFile.ps1
似乎调用了 Get-WebFile.ps1
并且 header 检查是否它需要 SSL。
因此,我创建了一个新的 powershell 函数文件以在名为 Get-ProxyUrl
的函数中执行必要的 URL 重写,并将此行添加到 Get-ChocolateyWebFile.ps1
检查 32 位的部分之后/64bit URL 但在 header 之前检查 URL (我的版本 0.9.9.2 文件中的第 101 行)。
$url = Get-ProxyUrl($url)
然后我还将它添加到 Get-WebFile.ps1
中 Get-WebFile
函数定义的最开头,以捕获对该函数的任何直接调用。
因此,这将允许我修复任何使用 Install-ChocolateyPackage
、Get-ChocolateyWebFile
或 Get-WebFile
的包,但仍然会留下一些包 - 例如 JDK8 - 指定它们自己的文件下载代码仍然失败。
因此,更好的解决方案是从 Chocolatey 安装中捕获任何 URLs...可能唯一的方法是安装一个本地代理服务器,chocolatey 可以使用它来转换 URLs... =43=] 被传递之前