【问题标题】:Issue building UWP app using MSBuild (GENERATEPROJECTPRIFILE)使用 MSBuild (GENERATEPROJECTPRIFILE) 构建 UWP 应用程序的问题
【发布时间】:2017-07-29 17:37:50
【问题描述】:

我正在尝试从命令行构建一个 UWP 应用,以实现从签入到发布到商店的构建自动化。在 Visual Studio 中运行构建时一切正常,当我创建应用程序包时,一切正常(但需要的时间太长,大约 15 分钟)。

在每个平台(x86、x64 和 ARM)调用 msbuild 时,似乎只有 ARM 失败并出现以下错误:

_CreatePriConfigXmlForSplitting

"C:\Source\MyProject\src\MyProject\MyProject.csproj" (Build target) (1) ->
(_SplitResourcesPri target) ->
  error PRI175 : 0x80070002 - Processing Resources failed with error : The system cannot find the file specified. [C:\Source\MyProject\src\MyProject\MyProject.csproj]
  GENERATEPROJECTPRIFILE : error PRI252: 0xdef00071 - File C:\Source\MyProject\output\Release\x86\arm\MyProject\resources.pri not found. [C:\Source\MyProject\src\MyProject\MyProject.csproj]

    0 Warning(s)
    2 Error(s)

您可能已经注意到,它使用的是x86\arm 目录而不是arm,因此构建失败。

我正在使用Cake 来构建它,下面是(相关部分)脚本:

Task("Build")
    .IsDependentOn("Clean")
    .IsDependentOn("UpdateVersion")
    .IsDependentOn("RestorePackages")
    .Does(() =>
{
    var platforms = new Dictionary<string, PlatformTarget>();
    platforms["ARM"] = PlatformTarget.ARM;
    platforms["x86"] = PlatformTarget.x86;
    platforms["x64"] = PlatformTarget.x64;

    foreach (var platform in platforms)
    {
        Information("Building project for platform {0}", platform.Key);

        var outputDirectory = "../../" + outputRootDirectory + "/" + platform.Value.ToString();
        var projectFileName = string.Format("./src/{0}/{0}.csproj", solutionName);

        var msBuildSettings = new MSBuildSettings {
            Verbosity = Verbosity.Diagnostic, // Verbosity.Minimal
            ToolVersion = MSBuildToolVersion.VS2017,
            Configuration = configurationName,
            MSBuildPlatform = MSBuildPlatform.x86, // Always require x86, see platform for actual target platform
            PlatformTarget = platform.Value
        };

        // Need special path since this is relative to the project file, not the cake build directory
        //msBuildSettings.Properties["OutputPath"] = new List<string>(new [] { outputDirectory });

        // We don't create native builds, we will use MSIL builds which the store will recompile,
        // for more info see https://oren.codes/2015/12/03/continuous-integration-for-uwp-projects-making-builds-faster/
        msBuildSettings.Properties["UseDotNetNativeToolchain"] = new List<string>(new [] { "false" });
        msBuildSettings.Properties["BuildAppxUploadPackageForUap"] = new List<string>(new [] { "true" });
        //msBuildSettings.Properties["AppxPackageArtifactsDir"] = new List<string>(new [] { outputDirectory });

        // Fix for broken targets
        //msBuildSettings.Properties["ProjectPriFileName"] = new List<string>(new [] { "resources.pri" });
        //msBuildSettings.Properties["ProjectPriFullPath"] = new List<string>(new [] { outputDirectory + "/resources.pri" });
        //msBuildSettings.Properties["_TransformedProjectPriFullPath"] = new List<string>(new [] { outputDirectory + "/resources.pri" });

        MSBuild(projectFileName, msBuildSettings);
    }
});

A.如您所见,我正在通过手动覆盖 ms 构建属性进行一些试验,但到目前为止还没有运气。

B.起初我以为是GenerateProjectPriFile 任务失败了。但是,经过一番调查,我发现创建拆分文件已经显示使用错误的startIndexAt 值:

<?xml version="1.0" encoding="utf-8"?>
<resources targetOsVersion="10.0.0" majorVersion="1">
  <packaging>
    <autoResourcePackage qualifier="Language" />
    <autoResourcePackage qualifier="Scale" />
    <autoResourcePackage qualifier="DXFeatureLevel" />
    <omitSchemaFromResourcePacks />
  </packaging>
  <index root="\" startIndexAt="C:\Source\MyProject\output\Release\x86\arm\MyProject\resources.pri">
    <default>
      <qualifier name="Language" value="en-US" />
      <qualifier name="Contrast" value="standard" />
      <qualifier name="Scale" value="200" />
      <qualifier name="HomeRegion" value="001" />
      <qualifier name="TargetSize" value="256" />
      <qualifier name="LayoutDirection" value="LTR" />
      <qualifier name="DXFeatureLevel" value="DX9" />
      <qualifier name="Configuration" value="" />
      <qualifier name="AlternateForm" value="" />
      <qualifier name="Platform" value="UAP" />
    </default>
    <indexer-config type="PRI" />
  </index>
</resources>

我不知道为什么在为 ARM 构建时它会在 ARM 之前添加 x86。任何帮助表示赞赏。同时,如果我发现新内容,我会继续调查和更新这篇文章。

【问题讨论】:

    标签: msbuild uwp cakebuild


    【解决方案1】:

    看来我必须指定 sln 文件,而不是 csproj 文件。这有点不幸,因为现在它构建的内容比它需要的要多得多(同一解决方案中有多个项目),但我可以通过创建自定义 MyProject.Build.sln 文件来解决这个问题

    【讨论】:

    • 所以澄清一下..这是一个蛋糕问题,还是直接从命令行构建时也是一个问题?
    • 不是蛋糕问题,它是 msbuild 的魔力,我找不到任何像样的文档(但仍然可以是我)
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多