【发布时间】:2013-08-30 09:01:11
【问题描述】:
我正在尝试自动设置开发人员机器软件安装。 Chocolatey 非常适合在您连接到 Internet 时安装软件包。有没有办法离线安装包?
我只想将所有包放在共享网络文件夹中并使用该包进行安装。如果您有内部应用程序,如何将它们转换为 Chocolatey 包?
【问题讨论】:
标签: chocolatey
我正在尝试自动设置开发人员机器软件安装。 Chocolatey 非常适合在您连接到 Internet 时安装软件包。有没有办法离线安装包?
我只想将所有包放在共享网络文件夹中并使用该包进行安装。如果您有内部应用程序,如何将它们转换为 Chocolatey 包?
【问题讨论】:
标签: chocolatey
虽然有一些方法可以设置原始 nupkg(上面有版本,而不是包目录中的那个 - 使用从 Chocolatey community package repository 上的包页面左侧下载)并将下载的二进制文件预设到缓存文件夹中,它是否会起作用并不总是确定性的。您还可以覆盖缓存位置,以便该文件夹不在 TEMP 中。请参阅 choco config、choco config -h 和 choco config set cacheLocation c:\some\location 来执行此操作。
对于您需要离线使用的软件包,您可以管理自己的软件包,并且可以将软件直接嵌入到软件包中。当您想离线管理软件时,这是需要的,因为社区存储库中的大多数内容都受版权法和分发权的约束(为什么他们不只是嵌入他们所代表的软件)。
创建和使用您自己的包非常安全,但确实会占用时间。如果您是为自己做这件事,那么它可能会覆盖您作为消费者使用 Chocolatey 和社区存储库所节省的任何时间。
对于组织,我们开发了 Package Builder,它可以在 5-10 秒内创建完整的软件部署(包)。它还可以在 60 秒内从现有安装的软件(程序和功能)中创建软件包!阅读有关Package Builder 的更多信息。
您可以在这里做的最好的事情是一个称为内部化的过程,您可以在其中下载并提取包,下载所有资源并将它们嵌入包中(或将它们放在本地的某个地方),编辑脚本以使用那些嵌入/local 资源并重新编译包。
这使您可以利用现有的包逻辑而不会出现互联网问题。
更多详情请见Manually Internalizing Packages和Package Internalizer - Automatically Internalize Packages。
大多数使用 Chocolatey 的组织都在做一些创建包和内部化包的组合,因为在生产场景中使用这些包时,他们需要可靠性以及对这些包的绝对信任和控制。
我创建了一个名为 ChocolateStore 的项目,该项目自动执行从在线资源复制 Chocolatey 包并使该包可供离线使用的过程。
您可以在此处查看源代码: https://github.com/BahKoo/ChocolateStore
【讨论】:
Chocolatey 的文档可能会这样回答问题的第一部分:“How To Host Your Own [Private/Internal/Public] Package Repository Server (aka Package Feed)”
它解释了三种类型的包存储库,使您能够在 LAN/Intranet 中或通过共享卷提供包:
问题的第二部分可以用Chocolatey’s documentation about recompiling packages 回答。标题听起来比实际上更复杂,可能只是“如何使现有的包本地化”,我认为那里描述的内容可以应用于问题作者所说的“内部应用程序”(我猜他的意思是程序也称为 .exe 文件,这些文件在任何公共提要中都不可用)。
【讨论】:
所以,我创建了一个Nullsoft 安装程序,它需要从离线计算机安装 Chocolatey 包。这些是总体步骤:
将 Chocolatey 包下载到临时目录:
NuGet.exe Install some_package_name -OutputDirectory C:\Temp\ChocoPackages -ExcludeVersion
在 Nullsoft 脚本中,添加这些行以获取下载包:
nsExec::Exec 'choco feature disable -n=allowGlobalConfirmation'
SetOutPath "${TmpPath}ChocoPackages" 文件 /r "C:\Temp\ChocoPackages*.*"
当仍在 Nullsoft 脚本中时,使用此命令从安装过程中放置文件的临时目录安装 Chocolatey 包:
choco install --Source "${TmpPath}ChocoPackages" ${Name_Of_ChocoPackage} --acceptlicense --yes
【讨论】:
漂亮。这正是我目前正在做的事情!
对于它的价值,从网络共享文件夹安装,我正在使用:
choco upgrade eclipse -y -s \\network\users\KyleStoflet\Eclipse
例如,这里我正在升级 Eclipse,我将多解释一下这一行:
-y 跳过确认
-s提供源路径
network 和 users 是我们网络和用户目录的占位符
...为了测试目的,我的目录中有我们的版本。在该目录中,有多个目录用于 Eclipse、Visual Studio 和我们用于开发的其他各种软件。
重要提示:我只对直接从Chocolatey packages page 检索到的 .nupkg 文件进行了此操作。我最终没有找到可执行文件的修复程序。
【讨论】:
将安装程序放入缓存目录:
%TEMP%\chocolatey\<pkg>\<version>
然后强制安装:
choco install -f <package_name>
在我的版本 (v0.9.10.3) 上运行良好。
【讨论】:
choco config和choco config set cacheLocation c:\somewhere
Chocolatey 使用$env:TEMP 作为缓存目录,下载文件放在
$env:Temp\chocolatey\Firefox\60.0.2\FirefoxInstall.exe
60.0.2为包版本,Firefox为包名。
【讨论】:
A.如何使用 Chocolatey 离线安装 Chocolatey 包
从 Chocolatey 网站下载 Chocolatey NuPackage。 https://chocolatey.org/api/v2/package/chocolatey
放入本地文件仓库,例如:D:\chocoOfflineRepository
choco source add -n=chocoOfflineControl -s="file:///d:/chocoOfflineRepository/"
choco install -f package
可选: 就我而言,我还将缓存文件夹设置为我的外部 D 驱动器,而不是我的管理员用户帐户上的 Temp 文件夹。
choco config set cacheLocation D:\chocoOfflineRepositoryB.如何离线安装 Chocolatey
另外,假设你已经安装了巧克力,但是,以防万一
$packageRepo = 'file:///d:/chocoOfflineRepository/chocolatey.0.10.15.nupkg'
$searchUrl = $packageRepo.Trim('/')#($packageRepo.Trim('/'), 'Packages()?$filter=(Id%20eq%20%27chocolatey%27)%20and%20IsLatestVersion') -join '/'
调试:
如果这里有错误:
Download-Package $searchUrl $localChocolateyPackageFilePath
cp d:/chocoOfflineRepository/chocolatey.0.10.15.nupkg C:\ProgramData\choco-cache\chocolatey.nupkg
Install-ChocolateyFromPackage $localChocolateyPackageFilePath
注意像@ferventcoder 指出的那样,它不是确定性的,由于内部依赖或代理限制,某些包可能无法工作。就我而言,由于公司代理,我无法使用远程社区库,所以我一直在使用它,直到找到更好的解决方案。 =)
【讨论】: