如何使用 Chef 在 Windows 上安装 Xamarin

How to install Xamarin on Windows using Chef

我使用 Chef 配置我的 TeamCity 构建代理(Windows Server 2012 VM),我需要为 Visual Studio/Android 构建安装 Xamarin。对于其他安装程序,我通常使用 /h/help/?-?-h--help 来调用它,直到我得到一个告诉我命令行参数的用法对话框。然而,我无法弄清楚 XamarinInstaller.exe 的命令行参数,当我像这样启动它时:

XamarinInstaller.exe /quiet /norestart

因为这些是常见的约定,它似乎只是坐在那里,什么都不做。它应该是下载的东西(当我用 GUI 启动它时它就是这样做的)但是当我在任务管理器中查看以太网使用情况时,没有发生任何事情。我不知道它在哪里写日志或如何知道它是否失败。好像失败了也不会退出

这是我的 Chef 代码:

xamarinTargets = 'C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.CSharp.targets'

xamarinInstaller = 'C:\Repo\Xamarin\XamarinInstaller.exe'

execute "Xamarin" do
  command "#{xamarinInstaller} /quiet /norestart"
  not_if { ::File.exist?(xamarinTargets) }
end

如何无头调用 Xamarin 安装程序?如何使用 Chef 安装它?

这是我必须做的,其中有些有点靠不住。

  1. 使用 chocolatey 食谱中的 chocolatey_package 资源通过 Chocolatey 安装 android-sdkxamarin-visualstudio
  2. 验证 Xamarin 安装是否按预期工作。
  3. 将预制的 android-sdk.zip 解压缩到 $HOME\AppData\Local\Android 中,以便在 Android SDK*
  4. 中安装我需要的一切
  5. 验证 Android SDK 安装是否按预期工作。
  6. 创建注册表项以将 Xamarin 的 Visual Studio 集成指向适当的 Android SDK。

这是 Chef 代码:

xamarinTargets = 'C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.CSharp.targets'

chocolatey_package 'android-sdk'
chocolatey_package 'xamarin-visualstudio'

ruby_block "Verify Xamarin MSBuild targets exist" do
    block do
        if not ::File.exist?(xamarinTargets)
            raise "Did not find #{xamarinTargets} which was supposed to have been created by the Xamarin install"
        end
    end
end

homeDir = "C:\Users\#{ENV['User']}"
androidDir = "#{homeDir}\AppData\Local\Android"
androidSdk = "#{androidDir}\android-sdk"
androidSdkZip = "C:\Repo\Android\android-sdk.zip"
adbExe = "#{androidSdk}\platform-tools\adb.exe"

seven_zip_archive "Android SDK API level 15" do
    path androidDir
    source androidSdkZip
    overwrite true
    not_if { ::File.exist?(adbExe) }
end

ruby_block "Verify Android adb.exe exists" do
    block do
        if not ::File.exist?(adbExe)
            raise "Did not find #{adbExe} which was supposed to have been created by the Android SDK install"
        end
    end
end

registry_key 'HKEY_USERS\S-1-5-18\Software\Novell\Mono\ for\ Android' do
  values [{
    :name => "AndroidSdkDirectory",
    :type => :string,
    :data => androidSdk
  }]
  recursive true
  action :create
end

*当通过 Chef 调用时,我无法让 android update sdk 正常工作。 Android SDK 管理器似乎不会 运行 甚至非图形化,除非它可以检测到它正在被用户 运行 ?!不确定,但最后无奈之下,我运行命令手动安装必要的SDK(我需要API 15级)和构建工具:

android update sdk --no-ui --all --filter "tools,platform-tools,build-tools-23.0.3,android-15"

然后我将生成的 $HOME\AppData\Local\Android\android-sk 目录压缩成上面提到的 "prefabbed android-sdk.zip"。