
在Visual中,一切都正常,组件目录是用适当的dll创建的。但是,TeamCity无法检索,因为恢复的触发器是Xamarin solution,在加载解决方案时运行。对于Xamarin来说,nuget包恢复的等价形式是茜素组分。我已经将xamarin-component.exe放置在我的C:\Windows目录中。为了配置TeamCity,我在命令行生成步骤前加上了
Command executable: xamarin-component
Command parameters: restore mysolution.slnTeamCity以\System的形式运行。所以使用PsExec,
psexec -i -s %SystemRoot%\system32\cmd.exe如果我运行‘xamarin-组件登录’
INFO (login): Computed cookie jar path: C:\Windows\system32\config\systemprofile\.xamarin-credentials
INFO (login): Computed cookie jar path: C:\Windows\system32\config\systemprofile\.xamarin-credentials
INFO (login): Credentials successfully stored.当我在cmd中使用我的解决方案并尝试恢复时,我会尝试下载组件,然后是Json解析错误。这与我在TeamCity中遇到的错误相同。

如果使用“Administrator”(它将凭据存储在C:\Users\Administrator中),则会得到错误。早些时候,当我使用我的个人帐户时,它确实奏效了。然而,一旦我删除了C:\Users\tim\AppData\Local\Xamarin\Cache\Components,,同样的问题出现了。Fiddler显示,与其让Json返回(就像我们输入无效令牌时那样),我们还得到了302重定向,表示对象移到了这里。这是xamarin登录页面--显然不是Json。
尝试. 1.将COOKIE_JAR_PATH设置为C:\Users\tim.xamarin-凭据- xpkg拾取但错误2。复制..xamarin凭据从Config\system32 32到D:\,将COOKIE_JAR_PATH设置为D:..xamarin凭据-凭据- xpkg提取但错误3。将..xamarin凭据移到C:\,设置COOKIE_JAR_PATH -相同的错误4。用COOKIE_JAR_PATH登录到C:..xamarin凭证-相同的错误证书。
我现在的临时想法是找出组件在哪里查找缓存并将文件放在那里。
C:\Windows\system32\config\systemprofile\AppData\Local\Xamarin\Cache\Components\xamandroidsupportv4-18-4.18.1.xam我的xamarin-成分的版本是0.99 -对于100,我们更努力.
发布于 2014-01-31 19:38:10
实际上,我很难从system32路径正确地加载cookie jar。我认为这是一个路径虚拟化问题,我只是不太了解这个问题。
最后,我添加了一个环境变量,该工具将从中读取(我是Xamarin :-)的主要作者,指定要读取的cookie jar路径,这解决了使用TeamCity的其他人的问题。环境变量是COOKIE_JAR_PATH。
您可以从TeamCity的环境设置中将其设置为指向system32概要目录之外的cookie jar路径(我认为在我最初的测试中,我将它放在C:驱动器的根目录中,但它确实可以在任何地方)。
发布于 2014-02-01 01:43:35
作为一个黑客,我从
C:\Users\tim\AppData\Local\Xamarin 至
C:\Windows\system32\config\systemprofile\AppData\Local\Xamarin\它绕过了与Xamarin服务器的通信。
更新。我怀疑这可能是他们服务器端的一个坏链接或设置。当调用xamarin-component还原时,调用
GET /api/available_versions?alias=xamandroidsupportv4-18 HTTP/1.1它返回“对象移动到这里”,其中“这里”不存在。

如果在删除缓存和组件文件夹(解决方案旁边)之后启动Visual,则Xamarin将调用
GET /api/download/xamandroidsupportv4-18/4.18.1 HTTP/1.0它有一个类似的外观对象,但这一次它将指向xamarin-components.s3.amazonaws.com/

GET /fdca922d2b77799fe208a08c9f3444fe/xamandroidsupportv4-18-4.18.1.xam HTTP/1.0也许发生了一些变化,或者available_versions API发生了变化。
发布于 2014-04-29 13:53:07
非常感谢这个问题和你对它的回答。我不太喜欢将auth cookie存储在构建节点上或必须手动复制缓存的想法,因此我想出了自己的解决方案,因此我使用了一个模仿xamarin-component.exe restore操作行为的快速Powershell脚本来解决这个问题:
param
(
[Parameter(Mandatory=$true)]
$authCookie,
[Parameter(Mandatory=$true)]
$componentDirectory,
[Parameter(Mandatory=$true)]
$project
)
[void]([System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem'))
$xml = [xml] $(cat $project);
$components = $xml.Project.ItemGroup.XamarinComponentReference | ? { $_.Include.Length -gt 0 } | % { $_.Include };
if (!(test-path $componentDirectory))
{
echo "$componentDirectory didn't exist, so it was created.";
[void](mkdir $componentDirectory);
}
foreach ($component in $components)
{
$source = "http://components.xamarin.com/download/$component";
$destination = "$componentDirectory\$component.zip";
if (test-path $destination)
{
echo "$destination already exists, skipping...";
continue;
}
echo "Downloading $component from $source to $destination...";
$client = New-Object System.Net.WebClient
$client.Headers.Add([System.Net.HttpRequestHeader]::Cookie, "XAM_AUTH=$authCookie");
try
{
$client.DownloadFile($source, $destination);
}
catch
{
# The error message will be on one of these lines hopefully:
write-error "Failed to download! Errors are below:";
write-error $_
write-error $_.Exception
write-error $_.Exception.InnerException
write-error $_.Exception.InnerException.InnerException
exit 1;
}
if (!(test-path $destination))
{
write-error "$destination doesn't exist - the download must have failed!";
exit 1;
}
echo "Decompressing $source to $componentDirectory"
[System.IO.Compression.ZipFile]::ExtractToDirectory($destination, $componentDirectory)
echo ""
}
echo "Done!";-authCookie参数可以从浏览器中的XAM_AUTH cookie中提取,也可以从主目录中的..xamarin凭据“XAM_AUTH”中提取。像这样参数化它是很好的,这样您就可以将它作为一个秘密变量存储在TeamCity中。
componentDirectory参数必须是到组件目录的完整路径-如果它不存在,它将被创建。
project参数应该是您想要还原包的项目的路径--如果您有多个需要这个参数的项目,那么您必须为每个项目执行脚本。不要指定解决方案,因为它不起作用。
不幸的是,这并不能很好地适应Xamarin的怪念头--一个简单的API更改可能会使它变得毫无用处,所以显然最好的解决方案是等待Xamarin修复这个问题。我发邮件给Xamarin支持来抱怨这个问题,但是我不认为我会得到及时的回应(最近他们看起来非常忙)。我希望这是有用的!
https://stackoverflow.com/questions/21068646
复制相似问题