React Native - 端口8081已在使用中,打包器未运行或未正常运行Command / bin / sh失败,退出代码为2

时间:2015-05-13 13:31:38

标签: xcode reactjs-native

我试图使用React Native启动并运行,我在Xcode中看到了以下消息:

  

端口8081已在使用中,打包器未运行或未正常运行

     

命令/ bin / sh失败,退出代码为2

我去了React Native troubleshooting page并试图杀死端口8081进程,但我仍然遇到同样的问题。

以下是我在Xcode中看到的截图:

error screenshots

任何帮助都将得到充分的赞赏。

13 个答案:

答案 0 :(得分:19)

如果按Facebook's troubleshooting page中的建议lsof -n -i4TCP:8081进行sudo lsof -n -i4TCP:8081并获得空结果,请使用 <!-- StateProvider --> <div ng-controller="demoController"> <button ng-click="goToHomePage()">Go To Home Page</button> </div> <!-- Load extra js --> <script type="text/javascript" src="js/lib/jquery/jquery-2.1.3.js"></script> <script type="text/javascript" src="js/lib/angular/angular.js"></script> <script type="text/javascript" src="js/lib/angular/angular-route.js"></script> <script type="text/javascript" src="js/lib/angular/angular-sanitize.js"></script> <script type="text/javascript" src="js/lib/angular/angular-animate.js"></script> <script type="text/javascript" src="js/lib/angular-ui/angular-ui-router.js"></script> <script type="text/javascript" src="js/appDemo.js"></script> <script type="text/javascript" src="js/service/DemoService.js"></script> <script type="text/javascript" src="js/controller/DemoController.js"></script> </body> 再试一次。

就我而言,事实证明McAfee防病毒软件正在运行侦听该端口的进程。杀死这个过程(我知道,我知道!)解决了这个问题。

答案 1 :(得分:12)

对于需要将端口8081更改为其他端口的人,请尝试以下步骤。

> npm start

将启动 node_modules / react-native / packager / packager.sh

在那里它将命令行参数合并,即--port到预定义的选项。即port = 8081

我更新了package.json start选项以包含我的首选端口,因为我无法使用此端口停止现有服务。

{
  "name": "AwesomeProject",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node_modules/react-native/packager/packager.sh --port=8999"
  },
  "dependencies": {
    "react-native": "^0.12.0"
  }
}

**请注意,这可能不适用于Android,显然硬编码为8081 Stack Post Here

构建Xcode 在构建Xcode时,它仍然会在尝试运行脚本以启动节点时失败。您将需要从构建过程中删除此脚本或将其更新到新端口。

libraries下选择React.xcodeproj。在主屏幕中选择Build Phases。您会看到Run Script

删除此条目,自己调用npm start,或编辑端口。

if nc -w 5 -z localhost 8999 ; then
  if ! curl -s "http://localhost:8999/status" | grep -q "packager-status:running" ; then
    echo "Port 8999 already in use, packager is either not running or not running correctly"
    exit 2
  fi
else
  open $SRCROOT/../packager/launchPackager.command || echo "Can't start packager automatically"
fi

<强>调试 似乎8081遍布全店。需要在xcode-project下额外更新RCTWebSocketExecutor.m:Libraries / RCTWebSocket.xcodeproj

- (instancetype)init
{
  return [self initWithURL:[RCTConvert NSURL:@"http://localhost:8999/debugger-proxy"]];
}

**从iOS启动打包器** 如果仅从iOS启动,那么您还需要编辑launchPackager.command以添加到适当的端口,因为Xcode使用此文件来运行javascript。

$THIS_DIR/packager.sh  --port=8999

答案 2 :(得分:9)

有同样的问题!

对于Android我可以使用adb to redirect port,但在iOS中,无法想象我们在自定义端口中运行React Native的方法。必须从McAfee接管8081端口。

对于无法直接终止McAfee进程/服务的Mac用户,您可以通过launchctl(macOS)卸载它,然后您可以在默认的8081端口上运行打包服务器。

cd /Library/LaunchDaemons
sudo launchctl unload com.mcafee.agent.macmn.plist

还写了一份备忘录来解释launchctl detail and MacOS boot flow

答案 3 :(得分:6)

借助别人的答案。我尝试了以下步骤。它对我有用,对其他人有希望。 仅适用于iOS。 假设我们要将 8081端口更改为8999端口

首先,打开Xcode。

  • 查看Project导航器(左)In [项目] / [项目] /AppDelegate.m:

    更改

    http://localhost:8081/index.ios.bundle?platform=ios&dev=true 
    

    http://localhost:8999/index.ios.bundle?platform=ios&dev=true
    
  • 在项目导航器中(左)[ProjectName] / Libraries:

    点击“React.xcodeproj”。在主面板上,单击“构建阶段”标记。

    展开“运行脚本”,用十字架删除它。

  • 在项目导航器中(左)[ProjectName] / Libraries / RCTWebSocket.xcodeproj / RCTWebSocketExecutor.m:搜索8081和 将其替换为8999

第二次打开Finder

在项目根目录中,打开“package.json”:

将“script”属性更改为:

{...

    "start": "node_modules/react-native/packager/packager.sh --port=8999"
...
}

然后打开终端

  • $ cd to project root:

    $ npm start

酷!然后

返回 Xcode并点击播放按钮。

交叉手指。

耐心等待。客户端会有一个空白。

你可以看到它正在后端构建(终端会记录它)。

答案 4 :(得分:2)

运行以下命令:

react-native start --port = 8088

迈克菲在8081上运行时遇到了同样的问题。这对我有用。

https://facebook.github.io/react-native/docs/troubleshooting.html

答案 5 :(得分:1)

我发现了问题:出于某种原因,我没有在port 8081上杀死进程,导致Xcode失败。

<强>解决方案:

  1. port 8081
  2. 上终止该过程
  3. 清洁Xcode:Xcode Menu > Product > Clean
  4. 重新打开Xcode。
  5. <强> 资源:

    React-Native Troubleshooting

答案 6 :(得分:1)

有趣的是,我遇到了同样的问题。但是对我来说解决方案有点不同,上面提到的方法都没有用。

我安装了LittleSnithc,当我在Xcode中运行时,LittleSnitch提示Xcode正在尝试连接到&#34; localhost.lan&#34;通过nc。当然,我没有理由否认它,然后构建失败。

我所做的只是拒绝将Xcode通过nc传递给LittleSnitch中的localhost.lan并且问题消失了!

答案 7 :(得分:1)

简便方法: 尝试使用以下代码

kill -9 $(lsof -t -i:8081)

答案 8 :(得分:0)

我的问题是Wifi DNS设置..

我。转到设置 - &gt; 网络即可。

II。选择已连接的Wifi,单击高级

III。选择 DNS ,您可能已将DNS服务器设置为 8.8.8.8 (天知道您的意图;))。将其删除并将其设置为默认值 192.168.1.1 。单击“确定”。

IV。在终端中运行 react-native run-ios ,它可以正常工作。

答案 9 :(得分:0)

我在运行react-native run-ios ----port=8088时遇到了同样的问题,但还没有尝试使用android

答案 10 :(得分:0)

我只是遇到了同样的问题,发现Docker正在使用8081端口。

因此,如果您需要使用React Native调试东西,则需要停止使用相同端口的docker。

答案 11 :(得分:0)

以下步骤对我有用,可以在iOS和XCode 10.1上运行react-native代码

  1. 在项目根文件夹中,转到ios文件夹,然后双击{projectName} .xcodeproject文件。这将打开XCode。
  2. 在XCode中,选择“文件>>项目设置”。
  3. 这将打开设置页面,在同一页面中,将“每用户项目设置:” >>“构建系统”从“用户共享设置”更改为“旧版构建系统”
  4. 保存您的更改。
  5. 然后npm install @babel/runtime --save-dev
  6. 然后使用命令react-native run-ios --port=8088运行项目。这将在8088端口中运行打包程序。

答案 12 :(得分:0)

在“ react” 16.8.6和“ react-native”中:“ 0.60.5”

转到[您的项目]> ios> [您的项目] .xcodeproj> project.pbxproj

将RCT_METRO_PORT更改为您的端口(例如:8089)

清理并构建。应该可以。

        shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8089}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n  if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n    if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n      echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n      exit 2\n    fi\n  else\n    open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n  fi\nfi\n";

更新

“反应”:“ 16.8.3”, “ react-native”:“ 0.59.8”,

node_modules> react-native> React> React.xcodeproj

将端口从8081更改为8082


在其他版本的react-native中,搜索字符串RCT_METRO_PORTalready in use,。在找到的结果中,将端口从8081更改为所需的端口(例如:8082)。