首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置TeamCity CI以使其解包Xamarin组件?

如何设置TeamCity CI以使其解包Xamarin组件?
EN

Stack Overflow用户
提问于 2014-01-11 22:22:39
回答 4查看 1.4K关注 0票数 8

在Visual中,一切都正常,组件目录是用适当的dll创建的。但是,TeamCity无法检索,因为恢复的触发器是Xamarin solution,在加载解决方案时运行。对于Xamarin来说,nuget包恢复的等价形式是茜素组分。我已经将xamarin-component.exe放置在我的C:\Windows目录中。为了配置TeamCity,我在命令行生成步骤前加上了

代码语言:javascript
复制
Command executable: xamarin-component 
Command parameters: restore mysolution.sln

TeamCity以\System的形式运行。所以使用PsExec,

代码语言:javascript
复制
psexec -i -s %SystemRoot%\system32\cmd.exe

如果我运行‘xamarin-组件登录’

代码语言:javascript
复制
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凭证-相同的错误证书。

我现在的临时想法是找出组件在哪里查找缓存并将文件放在那里。

代码语言:javascript
复制
C:\Windows\system32\config\systemprofile\AppData\Local\Xamarin\Cache\Components\xamandroidsupportv4-18-4.18.1.xam

我的xamarin-成分的版本是0.99 -对于100,我们更努力.

EN

回答 4

Stack Overflow用户

发布于 2014-01-31 19:38:10

实际上,我很难从system32路径正确地加载cookie jar。我认为这是一个路径虚拟化问题,我只是不太了解这个问题。

最后,我添加了一个环境变量,该工具将从中读取(我是Xamarin :-)的主要作者,指定要读取的cookie jar路径,这解决了使用TeamCity的其他人的问题。环境变量是COOKIE_JAR_PATH

您可以从TeamCity的环境设置中将其设置为指向system32概要目录之外的cookie jar路径(我认为在我最初的测试中,我将它放在C:驱动器的根目录中,但它确实可以在任何地方)。

票数 3
EN

Stack Overflow用户

发布于 2014-02-01 01:43:35

作为一个黑客,我从

代码语言:javascript
复制
C:\Users\tim\AppData\Local\Xamarin 

代码语言:javascript
复制
C:\Windows\system32\config\systemprofile\AppData\Local\Xamarin\

它绕过了与Xamarin服务器的通信。

更新。我怀疑这可能是他们服务器端的一个坏链接或设置。当调用xamarin-component还原时,调用

代码语言:javascript
复制
GET /api/available_versions?alias=xamandroidsupportv4-18 HTTP/1.1

它返回“对象移动到这里”,其中“这里”不存在。

如果在删除缓存和组件文件夹(解决方案旁边)之后启动Visual,则Xamarin将调用

代码语言:javascript
复制
GET /api/download/xamandroidsupportv4-18/4.18.1 HTTP/1.0

它有一个类似的外观对象,但这一次它将指向xamarin-components.s3.amazonaws.com/

代码语言:javascript
复制
GET /fdca922d2b77799fe208a08c9f3444fe/xamandroidsupportv4-18-4.18.1.xam HTTP/1.0

也许发生了一些变化,或者available_versions API发生了变化。

票数 3
EN

Stack Overflow用户

发布于 2014-04-29 13:53:07

非常感谢这个问题和你对它的回答。我不太喜欢将auth cookie存储在构建节点上或必须手动复制缓存的想法,因此我想出了自己的解决方案,因此我使用了一个模仿xamarin-component.exe restore操作行为的快速Powershell脚本来解决这个问题:

代码语言:javascript
复制
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支持来抱怨这个问题,但是我不认为我会得到及时的回应(最近他们看起来非常忙)。我希望这是有用的!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21068646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档