AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

还是请教默认目录的问题

Open realcsnake2023 opened this issue 8 months ago • 6 comments

升级到最新版本的AutoJs6-VSCode-Extension(1.0.12)后,我在操作时仍然会出现一些问题,主要是涉及到文件读写需要引用目录时,总是出问题,导致我只能在手机上直接运行才能正确运行程序,而如果在电脑端通过点击按钮或alt + F6 或 F6的方式运行,会因为默认目录,导致无法运行。 具体情况如下: 当我的代码比如:

const autojsUtils = require('./modules/autojs-utils');
autojsUtils.test();
var mypwd = files.read('../res/pwd.txt');
log(mypwd);

如果在手机上直接运行代码,会正常运行,并返回正确的结果:

01:00:56.320/V: 开始运行 [$cwd/测试/main.js].
01:00:56.327/D: Hello, AutoJs6 6.6.1
01:00:56.331/D: 11223344
01:00:56.332/V: [$cwd/测试/main.js] 运行结束 (用时 0.011 秒)

但如果在电脑上的VSCODE中通过Alt+F6运行(即运行项目),则会报错,提示如下:

01:02:04.676/V: 开始运行 [$cache/remote_project/f75f4ed0b00d6271b174b26a380185d7/main.js].
01:02:04.682/D: Hello, AutoJs6 6.6.1
01:02:04.685/E: Wrapped org.autojs.autojs.pio.UncheckedIOException: java.io.FileNotFoundException: /data/user/0/org.autojs.autojs6/cache/remote_project/res/pwd.txt: open failed: ENOENT (No such file or directory) (/data/user/0/org.autojs.autojs6/cache/remote_project/f75f4ed0b00d6271b174b26a380185d7/main.js#3)
Wrapped org.autojs.autojs.pio.UncheckedIOException: java.io.FileNotFoundException: /data/user/0/org.autojs.autojs6/cache/remote_project/res/pwd.txt: open failed: ENOENT (No such file or directory)
    at /data/user/0/org.autojs.autojs6/cache/remote_project/f75f4ed0b00d6271b174b26a380185d7/main.js:3:0

01:02:04.686/V: [$cache/remote_project/f75f4ed0b00d6271b174b26a380185d7/main.js] 运行结束 (用时 0.008 秒)

看提示是没有对应的文件或目录,似乎在电脑上点击时,默认的当前目录是“/data/user/0/org.autojs.autojs6/cache/remote_project/f75f4ed0b00d6271b174b26a380185d7/”, 而运行时它需要找到这个目录的上级目录下的另一个子目录(/res),即"/data/user/0/org.autojs.autojs6/cache/remote_project/res/“中的”pwd.txt",而手机内是找不到这个目录的,所以报错。那么,请问,我怎样设置才能使这个默认目录变为“$cwd/测试/”这一类型的目录呢?(我的理解只有设置这样,脚本才能正确运行)。辛苦各位大佬! @SuperMonster003 @terwer @kvii 辛苦各位大佬!

附:我的autojs当前目录设置的是 “/脚本”

Image

项目的目录是 /脚本/测试,目录结构是:

脚本/
├── temp/                             # 资源文件目录
│   ├──pwd.txt                      # 口令文件
│   └──pic1.png                    # 截图
├── 测试/                             #项目文件夹
│   ├──modules/                  #模块文件夹
│   │   └──autojs-utils.js       #模块文件
│   ├──main.js                      # 主程序
│   ├──package.json
│   ├──project.json
│   ├──tsconfig.json
└── other/                           # 其他目录

autojs-utils.js是自动生成的,内容为:

module.exports = {
    greetingPrefix: 'Hello',
    test() {
        /* e.g. "Hello, AutoJs6 6.4.1" */
        toastLog(`${this.greetingPrefix}, ${context.getString(R.strings.app_name)} ${app.autojs.versionName}`);
    },
};

截图如下: Image Image Image

realcsnake2023 avatar Apr 15 '25 17:04 realcsnake2023

我不是开发者,只是个普通用户。我按照我的使用经验说一下: 1、新建项目的方式,我目前测试不能点击运行文件的方式运行,也就是为什么你上面说的报错。我也是这样,具体的你要看看作者的解释 2、1 说了,项目你要点击运行项目,也就是你当前文件切换到 project.json。然后工具栏按钮会出现运行项目。也可以快捷键 注意是运行项目,不是运行文件

Image

Image

或者

Image

3、读取文件一般我是说使用绝对路径

注意了这几点基本上可以目前避坑开发了。实际是否需要修复需要作者斟酌。

terwer avatar Apr 16 '25 02:04 terwer

这个问题看起来与 #340 与 #339 是相同的, 我将此 issue 从 VSCode 插件项目转移到 AutoJs6 主项目了.

等这几天新版本 (6.6.2) 发布之后, 可以再关注一下上述问题是否已解决.

SuperMonster003 avatar Apr 16 '25 06:04 SuperMonster003

等这几天新版本 (6.6.2) 发布之后, 可以再关注一下上述问题是否已解决.

@SuperMonster003 哇偶!刚才升级了6.6.2,解决了以上大部分的问题,使用和调试方便多了。十分感谢!!!

比如,我现在创建的项目“测试”,项目位于“/sdcard/脚本/测试”文件夹,在引用文件后,通过vscode调试项目(alt+f6)时,对于①、②、③三个位置的pwd.txt文件,②和③都可以通过相对路径引用,①不可以通过相对路径引用,只能通过绝对路径引用(如果点击手机里的autojs的运行项目按钮,可以正常运行不报错)。

①、var mypwd = files.read('../res/pwd.txt'); 点"运行项目"或ALT+F6时运行报错,在手机上直接运行正常;
②、var mypwd = files.read('./pwd.txt'); 运行正常;
③、var mypwd = files.read('./subdir/pwd.txt'); 运行正常;

(我这样设置文件夹,原本是为了把一些抓好的图、和修改好的密码待文件放在项目之外的的某个文件夹,这样当我再次保存整个项目到手机时,不会覆盖掉我已经改好的图片和密码文件,或者和朋友共同使用这个项目时,他修改的密码文件不会因为我的再次保存项目而变成我的密码——————我的这个要求可能太偏了,也许还有更好的方案,只是我没想到。)

脚本/                                       #
├── res/                                # 项目文件
│   ├──pwd.txt                      # 口令文件①(当使用相对路径时,通过vscode运行会报错误,在手机上直接运行正常)    
│   │                                       # 代码为 var mypwd = files.read('../res/pwd.txt');
│   └──pic1.png                    # 截图
├── 测试/                             #当前项目文件夹
│   ├──modules/                  #模块文件夹
│   │   └──autojs-utils.js       #模块文件
│   ├──main.js                      # 当前主程序
│   ├──pwd.txt                     # 口令文件②(可以使用相对路径)var mypwd = files.read('./pwd.txt');
│   ├──package.json
│   ├──project.json
│   ├──tsconfig.json
│   └──subdir/
│        └──pwd.txt                # 口令文件③(可以使用相对路径)var mypwd = files.read('./subdir/pwd.txt');
└── other/                           # 其他目录

Image

realcsnake2023 avatar Apr 16 '25 11:04 realcsnake2023

VSCode 运行项目的原理, 是将 VSCode 所在操作系统 (Windows/Linux/Mac OS/...) 上的文件, 以项目的形式发送到 AutoJs6 所在操作系统 (Android) 的临时目录中, 然后调用 AutoJs6 的接口执行这个临时目录的文件.

所以使用 VSCode 运行项目时, 它运行的文件是不会在 AutoJs6 上面看到的 (除非导航到 cache 目录).

例如我们使用 VSCode 新建一个项目, 名称为 Foo, 然后编写简单的代码, 例如打印字母 "A". 此时使用 VSCode 运行项目, 是可以正常执行代码的, 然而此时 AutoJs6 中并没有这个 Foo 项目.

使用 VSCode 保存这个 Foo 项目到 AutoJs6 App 所在的设备, 项目会发送到工作目录 (如 /storage/emulated/0/脚本/), 然后 AutoJs6 就可以看到这个项目了. 在 AutoJs6 上运行 Foo 项目, 同样会打印字母 "A".

回到 VSCode, 将打印字母的代码修改, 例如打印字母 "B", 运行项目, AutoJs6 会打印字母 "B", 但如果在 AutoJs6 上运行 Foo 项目, 依然会打印字母 "A", 这是因为 VSCode 运行的修改后的项目是发送到临时目录中的, 并不会同步更新 AutoJs6 已经存在的 Foo 项目.

明白这个原理之后, /res/ 目录的问题就容易理解了. 它是位于 AutoJs6 所在设备上的, VSCode 运行项目时, 发送到临时目录中的所有文件当中, 并不包含这个 /res/ 目录, 因此会出现截图中的问题. 一个解决方案是将 /res/ 目录由 AutoJs6 所在设备复制到 VSCode 所在设备中, 但这会出现两个问题: 一是 /res/ 目录需要时刻记得两端同步, 二是它必须包含在项目根目录之内 (对应你的 "测试" 目录), 目前它位于项目目录之外, 是不会被发送到临时目录的.

SuperMonster003 avatar Apr 16 '25 17:04 SuperMonster003

VSCode 运行项目的原理, 是将 VSCode 所在操作系统 (Windows/Linux/Mac OS/...) 上的文件, 以项目的形式发送到 AutoJs6 所在操作系统 (Android) 的临时目录中, 然后调用 AutoJs6 的接口执行这个临时目录的文件.

所以使用 VSCode 运行项目时, 它运行的文件是不会在 AutoJs6 上面看到的 (除非导航到 cache 目录).

例如我们使用 VSCode 新建一个项目, 名称为 Foo, 然后编写简单的代码, 例如打印字母 "A". 此时使用 VSCode 运行项目, 是可以正常执行代码的, 然而此时 AutoJs6 中并没有这个 Foo 项目.

使用 VSCode 保存这个 Foo 项目到 AutoJs6 App 所在的设备, 项目会发送到工作目录 (如 /storage/emulated/0/脚本/), 然后 AutoJs6 就可以看到这个项目了. 在 AutoJs6 上运行 Foo 项目, 同样会打印字母 "A".

回到 VSCode, 将打印字母的代码修改, 例如打印字母 "B", 运行项目, AutoJs6 会打印字母 "B", 但如果在 AutoJs6 上运行 Foo 项目, 依然会打印字母 "A", 这是因为 VSCode 运行的修改后的项目是发送到临时目录中的, 并不会同步更新 AutoJs6 已经存在的 Foo 项目.

明白这个原理之后, /res/ 目录的问题就容易理解了. 它是位于 AutoJs6 所在设备上的, VSCode 运行项目时, 发送到临时目录中的所有文件当中, 并不包含这个 /res/ 目录, 因此会出现截图中的问题. 一个解决方案是将 /res/ 目录由 AutoJs6 所在设备复制到 VSCode 所在设备中, 但这会出现两个问题: 一是 /res/ 目录需要时刻记得两端同步, 二是它必须包含在项目根目录之内 (对应你的 "测试" 目录), 目前它位于项目目录之外, 是不会被发送到临时目录的.

感谢,讲的太细了,解决了我很久以来的疑问!

realcsnake2023 avatar Apr 16 '25 23:04 realcsnake2023

目录

“VSCode 运行项目的原理, 是将 VSCode 所在操作系统 (Windows/Linux/Mac OS/...) 上的文件, 以项目的形式发送到 AutoJs6 所在操作系统 (Android) 的临时目录中, 然后调用 AutoJs6 的接口执行这个临时目录的文件.”,这个接口能给一下吗,要怎么调用,万分感谢,因为还有一些需要电脑和手机交互,所以 js 只是整个工程中的一环,拜谢

fanvcz934n avatar Aug 14 '25 06:08 fanvcz934n