小编Tay*_*nan的帖子

CI服务器上缺少Microsoft.Windows.UI.Xaml.CSharp.targets

问题

我刚刚在源代码控制中添加了一个UWP应用程序.但是,我的CI服务器(Jenkins)似乎不喜欢这样:

错误MSB4019:找不到导入的项目"C:\ Program Files(x86)\ MSBuild\Microsoft\WindowsXaml\v14.0\Microsoft.Windows.UI.Xaml.CSharp.targets".确认声明中的路径是否正确,以及该文件是否存在于磁盘上.

这源于以下UWP项目文件导入:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
Run Code Online (Sandbox Code Playgroud)

在我的本地计算机上,我可以看到此文件位于:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\WindowsXaml\v15.0\Microsoft.Windows.UI.Xaml.CSharp.Targets
Run Code Online (Sandbox Code Playgroud)

显然,这是由于我本地安装的Visual Studio 2017.但是,CI服务器没有安装Visual Studio.我想这就是MSBuildExtensionsPath解决错误中提到的路径的原因.

依赖

CI服务器上已安装以下项目:

  • Visual Studio Build Tools 2017(下载)
  • Windows 10 SDK 10.0.15063.468(下载)
  • Xamarin.VisualStudio 4.5.0.476(下载)
  • .NET Framework 4.5.1-4.7 SDK

我假设这些将包括必要的依赖项,但我找不到Microsoft.Windows.UI.Xaml.CSharp.targets任何地方.

解决方法

复制本地计算机上的目录

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\WindowsXaml\v15.0
Run Code Online (Sandbox Code Playgroud)

到CI服务器

C:\Program Files (x86)\MSBuild\Microsoft\WindowsXaml\v14.0
Run Code Online (Sandbox Code Playgroud)

似乎解决了错误,但感觉非常hacky.

有没有办法解决这个问题,而无需在CI服务器上安装Visual Studio 2017或手动复制/重命名文件?


更新2018-01-12:

对于最新版本的VSBT,这仍然是一个问题.唯一要报告的是错误从v14更改为v15.将同一目录复制到v15后,错误再次消失.但是,出现了另一个看似无关的错误:

C:\ Program Files(x86)\ Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(1124,5):错误MSB3644:框架的参考程序集".NETCore,Version = v5.0"未被发现.要解决此问题,请为此框架版本安装SDK或Targeting Pack,或者将应用程序重新定位到已安装SDK或Targeting Pack的框架版本.请注意,程序集将从全局程序集缓存(GAC)中解析,并将用于代替引用程序集.因此,您的程序集可能无法正确定位到您想要的框架.


更新2018-01-15

.NETCore,Version=v5.0 通过将以下目录从本地计算机复制到构建服务器来解决错误:

C:\Program …
Run Code Online (Sandbox Code Playgroud)

msbuild continuous-integration uwp

15
推荐指数
1
解决办法
2970
查看次数

建议如何从 Xamarin.Forms XAML 中的隐式样式继承?

我有一些继承自 Application ResourceDictionary 中定义的隐式样式的问题。我尝试了几种不同的方法,但每种方法都以一种或另一种形式不成功。

尝试一:继承隐式风格

应用资源字典

<Style TargetType="Button">
    <Setter Property="BackgroundColor" Value="#1386F1" />
    <Setter Property="TextColor" Value="White" />
    <Setter Property="FontAttributes" Value="Bold" />
    <Setter Property="HeightRequest">
      <OnPlatform x:TypeArguments="x:Double" iOS="30" Android="50" />
    </Setter>
    <Style.Triggers>
      <Trigger TargetType="Button" Property="IsEnabled" Value="False">
        <Setter Property="BackgroundColor">
          <OnPlatform x:TypeArguments="Color" iOS="#E8E8E8" />
        </Setter>
      </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

页面资源字典

<Style x:Key="LoginButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="BackgroundColor" Value="#024886" />
    <Setter Property="Margin">
      <OnPlatform x:TypeArguments="Thickness" iOS="0,5" />
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

页面控制

<Button Style="{StaticResource LoginButtonStyle}" />
Run Code Online (Sandbox Code Playgroud)

结果

引发异常“未找到键 {x:Type Button} 的静态资源”。这就是我记得在 WPF 中这样做的方式,但我假设 Xamarin XAML 不支持此操作。

尝试 2:继承常见的显式样式

应用资源字典 …

inheritance xaml xamarin xamarin.forms

7
推荐指数
1
解决办法
1016
查看次数

有没有办法在没有猴子修补的情况下装饰/拦截Angular 4中的内置指令?

问题

我试图NgForm通过拦截onSubmit函数来添加内置指令的功能,以防止双重提交和无效提交,但我没有找到一种方法,没有猴子修补.

失败的尝试1:装饰器通过依赖注入

我真的不希望这与指令一起工作,因为它们不是真正的"提供者",但我还是尝试了它(无济于事).

import { Injectable } from '@angular/core';
import { NgForm } from '@angular/forms';

@Injectable()
export class NgFormDecorator extends NgForm {
    constructor() {
        super(null, null);
    }

    onSubmit($event: Event): boolean {
        // TODO: Prevent submission if in progress
        return super.onSubmit($event);
    }
}

// Module configuration
providers: [{
    provide: NgForm,
    useClass: NgFormDecorator
}]
Run Code Online (Sandbox Code Playgroud)

工作尝试2:具有次要指令的猴子补丁

这很好用,但显然不理想.

import { Directive, Output, EventEmitter } from '@angular/core';
import { NgForm } from '@angular/forms';
import { Observable } from 'rxjs/Observable';
import …
Run Code Online (Sandbox Code Playgroud)

javascript rxjs typescript angular

7
推荐指数
1
解决办法
187
查看次数

在 ObservableCollection 上使用 LINQ 和 GroupBy 和 Sum 聚合

我有以下代码块可以正常工作;

var boughtItemsToday = (from DBControl.MoneySpent
            bought in BoughtItemDB.BoughtItems
            select bought);

BoughtItems = new ObservableCollection<DBControl.MoneySpent>(boughtItemsToday);
Run Code Online (Sandbox Code Playgroud)

它从我的 MoneySpent 表中返回数据,其中包括 ItemCategory、ItemAmount、ItemDateTime。

我想将其更改为按 ItemCategory 和 ItemAmount 分组,这样我就可以看到我把大部分钱花在哪里了,所以我创建了一个 GroupBy 查询,最后得到了这个;

var finalQuery = boughtItemsToday.AsQueryable().GroupBy(category => category.ItemCategory); 

BoughtItems = new ObservableCollection<DBControl.MoneySpent>(finalQuery);
Run Code Online (Sandbox Code Playgroud)

这给了我 2 个错误;

错误 1 ​​“System.Collections.ObjectModel.ObservableCollection.ObservableCollection(System.Collections.Generic.List)”的最佳重载方法匹配有一些无效参数

错误 2 参数 1:无法从“System.Linq.IQueryable>”转换为“System.Collections.Generic.List”

这就是我被困的地方!如何使用 GroupBy 和 Sum 聚合函数在 1 个 LINQ 查询中获取我的类别和相关支出的列表?!

感激地收到任何帮助/建议。

标记

c# linq group-by sum observablecollection

3
推荐指数
1
解决办法
8367
查看次数