无法读取 null 的 属性 'emit'

Cannot read property 'emit' of null

在使用 Appcelerator SDK 5.5.1.GA 执行构建时,在调用 xcodebuild 后会抛出错误,文本无法读取 属性 'emit' of null。直到上周它都可以正常工作。它仅在我制作 AdHoc 或 Production IPA 时发生。它在模拟器中启动没有任何问题。

如果我通过 Studio 或使用控制台进行操作,就会发生这种情况。如果社区中有人遇到过这个问题,请告诉我。如果我使用的是 5.5.0.GA 等较旧的 SDK,那么构建工作正常。

XCode:7.3.1 节点:0.12.7

尝试升级到更新版本的 npm (3.x)。我在其他非 Appcelerator 项目中看到过这个问题。

您可以尝试通过终端执行以下命令并清理构建 "Project>>Clean"

  • appc 注销
  • appc 登录

此外,我看到您使用的是相当旧版本的 Ti SDK、Xcode 和 node.js。所以你可以更新你的环境然后试试看。 - https://platform.appcelerator.com/#/product/cli

希望对您有所帮助。

我终于成功了,没有迁移我所有的环境。仅更新 Appcelerator CLI、Alloy 和 Node

首先更新您的 Appcelerator CLI

sudo npm install -g appcelerator
appc setup

那你需要更新Alloy1.8.0+

sudo npm install -g alloy

接下来修改您的项目以反映 Alloy 1.8.0 先决条件:http://www.appcelerator.com/blog/2016/03/alloy-1-8-relocates-i18n-and-platform-directories/

-> 将 /i18n 和 /platform 目录移动到 /app/i18n 和 /app/platform

最后重启电脑。

PS 这是我的新配置:

  • 工作室 4.5.0
  • SDK 5.2.0.GA
  • XCode7.3.1
  • npm 2.14.7
  • 节点 4.2.0
  • CLI 5.0.12

除了我的开发人员已经提到的上述过程之外,以下过程也可以在不对环境进行任何更改的情况下进行。这将需要两阶段构建。

供参考让我们使用这个link作为参考: Appcelerator iOS Build JS (_build.js)

要解决此问题,您可以从终端启动构建

appc run --build-only -T dist-adhoc --project-dir ~/Code/MyApp

构建启动后,让它完成并等待

invoking xcode

被调用并抛出错误。抛出错误后,转到以下文件夹:

build/iphone/build/Products/Releases-iPhone

里面有APP文件和DSYM文件。如果没有,请等待 2-3 分钟,XCode 构建的后台进程将完成。看到这两个文件后,在本例中打开 SDK (5.5.1.GA) 的 _build.js。您可以找到构建开始时控制台中显示的路径。

打开_build.js文件,进入下面的函数

iOSBuilder.prototype.run = function (logger, config, cli, finished)

里面有一个系列,里面有所有的函数调用。在这里您需要进行以下更改:

function (next) {
        cli.emit('build.pre.construct', this, next);
    },

    // initialization
    //'doAnalytics',
    'initialize',
    'loginfo',
    //'readBuildManifest',
    //'checkIfNeedToRecompile',
    //'initBuildDir',

    /*
    function (next) {
        cli.emit('build.pre.compile', this, next);
    },

    function () {
        // Make sure we have an app.js. This used to be validated in validate(), but since plugins like
        // Alloy generate an app.js, it may not have existed during validate(), but should exist now
        // that build.pre.compile was fired.
        ti.validateAppJsExists(this.projectDir, this.logger, ['iphone', 'ios']);
    },

    // xcode related tasks
    'createXcodeProject',
    'writeEntitlementsPlist',
    'writeInfoPlist',
    'writeMain',
    'writeXcodeConfigFiles',
    'copyTitaniumLibraries',
    'copyTitaniumiOSFiles',
    'copyExtensionFiles',
    'cleanXcodeDerivedData',

    // titanium related tasks
    'writeDebugProfilePlists',
    'copyResources',
    'encryptJSFiles',
    'writeI18NFiles',
    'processTiSymbols',

    // cleanup and optimization
    'removeFiles',
    'optimizeFiles',

    // provide a hook event before xcodebuild
    function (next) {
        cli.emit('build.pre.build', this, next);
    },

    // build baby, build
    'invokeXcodeBuild',

     */

    // provide a hook event after xcodebuild
    function (next) {
        cli.emit('build.post.build', this, next);
    },

    // finalize
    'writeBuildManifest',

    function (next) {
        if (!this.buildOnly && (this.target === 'simulator' || this.target === 'device')) {
            var delta = appc.time.prettyDiff(this.cli.startTime, Date.now());
            this.logger.info(__('Finished building the application in %s', delta.cyan));
        }

        cli.emit('build.post.compile', this, next);
    },

    function (next) {
        cli.emit('build.finalize', this, next);
    }

现在再次 运行 appc 运行 命令。现在这将采用最后一个构建并从中准备 IPA。这是一个漫长的过程,但无需任何环境更改即可完成工作。