【问题标题】:Make PhpStorm watch (specific) file and upload upon change制作 PhpStorm 监视(特定)文件并在更改时上传
【发布时间】:2018-02-16 23:40:58
【问题描述】:

我正在寻找一种让 PhpStorm 监视文件的方法——这样每次它发生变化时,它都应该将该文件同步到远程服务器。而“上传外部更改”选项(带有“在显式保存操作时”)对我工作。它很接近 - 但没有雪茄。它让我保存了两次 css 文件 - 只有在我第二次保存 scss 文件之后,它才会上传 gulp-compiled-style.css 文件,就像我希望在第一次“保存”之后那样.我知道这是一件小事——但对于我每天轻松完成 200-400 次的事情,我希望它尽可能顺利地运行。这既是我两次保存文件的时间 - 但它也是我心中的疑问,每次事情不像我想要的那样 - 然后我总是必须先检查文件是否正确上传。

我正在使用 Wordpress,我有 5-8 个 SCSS 文件,这些文件正在使用 gulp 进行编译。 gulp-procedures 非常全面(autoprefixer、merge-media-queries、minifycss 等),因此编译文件需要几毫秒。我认为正是编译时间使 PhpStorm “错过” style.css 已更改 - 因此不要在第一次“保存”时上传它。因为有时所有内容都会在第一次“保存”之后上传 - 但它只是每 8 次(左右)。

额外有趣的事实(可能表明尸体埋在哪里):如果我在后台从终端运行gulp watch,那么我必须保存文件,等待至少 2-4 秒然后保存再次,在上传 gulp-compiled-style.css 文件之前。如果我按“保存”、“保存”、“保存”、“保存”- 少于 2-4 秒的暂停,但只有 1 秒的暂停,那么 PhpStorm 永远不会同步 gulp-compiled-style.css-file . 如果我从 PhpStorm 的 Gulp-integration(不是终端,而是 Gulp-prompt)运行gulp watch,那么我可以连续保存两次,中间只有 0.5 秒的停顿(只要底部的进度条消失) - 然后它上传(每次, - 一致)。

只有上传 gulp-compiled-style.css-file 才是问题所在。其他一切都运行良好。

这是我尝试过的:

**Attempt1) 我以前使用过 Atom,其中 FTP 配置是使用带有 .ftpconfig 文件的插件建立的。在那个文件中,有一个'watch: []'-参数,我可以在其中指定一个要“监视”的文件。这创造了奇迹!我试图找到一个可以做类似事情的插件 - 但找不到它。

**Attempt2) 我读过support-pages 中的一篇,也与此有关。似乎如果 SCSS 文件是使用 PhpStorm 编译的,那么它知道上传 style.css 文件(在编译之后)。我无法使用 PhpStorms 的 SCSS 编译来设置我的 gulp 文件(因为它会编译它,然后通过多个过程管道传输内容。如果我更改项目并且每次都必须设置它,那么这将是一个痛苦维护。

**Attempt3) 我想过做一个宏什么的。然后看看我是否可以将CMD-s 重新映射到'save-current-file-and-execute-the-macro'。但是,如果我不编辑 scss 文件(而只是一些 php 文件),那么它仍然会上传 style.css 文件。这绝不是一个漂亮的解决方案,但它只是显示了我在寻找自动化解决方案的过程中走了多远。

**Attempt4) 我考虑将它构建到 gulp 文件中,它必须在编译完 style.css 文件后上传 style.css 文件。我考虑从.idea-文件夹中获取主机和用户名-并从钥匙串中获取密码,然后以这种方式建立 sftp 连接。但是这样做很快变得广泛,所以我希望有一种更简单/更好的方法。

加法1

LazyOne 询问,我用文件观察器尝试了什么,所以这里。我尝试让 PhpStorm 编译 Scss 文件(所以 PhpStorm 基本上做了 Gulp 今天为我做的事情)。 所以这是一个 SCSS-filewatcher(文件类型),范围是我项目中的 SCSS 文件,将“程序”指向我的 ruby​​ 安装的 scss 文件等,等等。

但是...我意识到让 PhpStorm 对 Scss 文件执行与 Gulp 文件相同的操作是很困难的。

我使用的 Gulp 文件随每个项目一起提供(默认情况下)——我们是几个从事相同项目的网页设计师。因此,如果我突然使用该 Gulp 文件执行其他操作,那么我很确定我必须能够产生完全相同的结果,否则我很确定我的同事会活活剥我的皮。但是在我放弃之前,我尽可能地把它作为我的论点(在它完成我的 Gulp 文件所做的之前,我仍然需要在这一行中做几件事):

--no-cache --update $FileName$:../../style.css --style compressed --sourcemap=none

...但是...当这样做时,我可以得出结论,style.css-file 在每次保存时上传(得分!)。这意味着如果我可以设置某种文件观察器,那么希望 PhpStorm 会观察该文件并因此在 Gulp 编译完 style.css 后上传它。

所以我尝试制作一个文件观察器,它可以观察 style.css 文件——但我不知道该放什么作为我的“程序”。因为基本上我希望 PhpStorm 用一根棍子戳 style.css 文件三次 - 然后意识到文件已经更改并将其上传到服务器。这可以自动完成吗?

【问题讨论】:

  • 如果您在 IDE 之外编译您的东西(gulp watch 等)......那么我能提供的最好的方法是 1)尝试将其实际实现为 File Watcher。如果您已经尝试过 - 显示您尝试过的内容。如果您在该论坛主题中查看我的 cmets - 它应该可以工作 2) 手动点击 File | Synchronize(此操作会检查所有本地项目文件,以查找在 IDE 之外进行的可能更改)。一旦找到此类更改,“上传外部更改”应跳转。
  • 嗯 ... 1) 您可以让多个文件观察程序处理同一个文件(将一个接一个地运行),或者您只是对它们进行批处理(通过自定义中间脚本 .. 或 gulp 任务)2 )您可以创建专用的 gulp 任务来执行此类编译/任何操作(因此您将所有逻辑保留在内部)并在 File Watcher 中调用它。在这两种情况下(正如我在该论坛帖子中所述),关键是将 Path to refresh 字段指向目标生成的文件——这是 IDE 将在文件观察程序完成后检查更改的文件。
  • 两者都没有。在#1中,我的意思是-如果您需要在一个/同一个文件上运行几个不同的东西(例如,首先“scss into css”;然后是“prefixer”;然后是“minification”),那么您可以设置 3 个文件监视程序,它们将一个接一个地跑。但这并不理想。
  • 因此我建议 #2 .. 我的意思是 -- 执行专门的 gulp 任务作为文件观察器。这意味着:创建单独的 gulp 任务(或您已经完成的任何任务)来执行此类“编译此文件”工作。然后——在 File Watcher 中使用它——从那里执行那个 gulp 任务。程序——你的 gulp 可执行文件的路径; params -- 在命令行中执行这个 gulp 任务所需的任何参数。
  • 老实说——我没有任何工作示例(我自己没有使用过这个——我只使用“基本”文件观察程序——使用@编译 SCSS/LESS 987654334@ 或 lessc -- 这对于我在这里所做的事情已经足够了。但我会尝试找到一个。同时 -- 你是否尝试过在 PhpStorm blog.jetbrains.com/webstorm/2014/11/gulp-in-webstorm-9 中集成 Gulp(它有专门的工具窗口)?如果你从那里运行这样的“gulp watch”任务,它应该会接收到这样的文件修改(见youtrack.jetbrains.com/issue/WEB-14873youtrack.jetbrains.com/issue/WI-28567

标签: intellij-idea gulp phpstorm


【解决方案1】:

好的。这是它的完成方式!

重要的部分是 PhpStorm 监视 style.css 文件。如果您指向文件观察程序来查看文件,它将执行此操作。现在,起初我尝试使用 File Watcher 运行 Gulp 文件。然后我尝试使用 File Watcher 编译 scss 文件。但这不是必需的。重要的部分是“刷新的输出路径”(正如@LazyOne 在 cmets 中指出的那样)。所以我想到的最好的解决方案是制作一个什么都不做的bash脚本。它看起来像这样:

#!/bin/bash

sleep .01

我称之为“什么都不做”。我不必为它工作而执行sleep .01,但它不会阻止它工作(基于我完成的 20 次上传测试)。在我看来,最好在保存 scss 文件之后有一个短暂的延迟(这样 PhpStorm 中的 gulp-integration 就有时间完成 style.css 文件的编译)。

这是我的文件观察器的设置:

范围是定制的,我已将其设置为:

file[PROJECTNAME]:wp-content/themes/THEME_NAME/assets/sass/*

但我认为范围可能只是整个项目,因为它只是在执行“程序”之前寻找 SCSS 文件在该范围内发生变化的时间(如果我正确理解了整个 File Watcher 的话)。

我正在做一个项目,SCSS 文件位于

/wp-content/themes/THEME_NAME/assets/sass/STYLEDIRNAME/

在这种情况下,“刷新的输出路径”应该设置为以下几行:

$FileDirRelativeToProjectRoot$/../../style.css

$ProjectFileDir$/wp-content/themes/THEME_NAME/style.css

如果您展开“其他选项”,则必须将 Working directory 设置为项目的根,以便它工作:

/Users/USERNAME/dropbox/foo/bar/

这个解决方案的缺点是,如果 PhpStorm 比 Gulp 任务更快,因为它会在 Gulp 任务完成编译之前上传 style.css 文件(因此上传旧的或不完整的文件)。在我的 20 次简短测试中,这并没有发生。但如果发生这种情况,那么我会在“donthing”文件中设置更高的延迟,看看是否能解决它。

加法1

我刚刚经历过,它不起作用 - 它没有在每次编译/保存时上传 style.css(但我可以发誓设置是正确的)。所以我重新启动了 PhpStorm 然后它工作了。我尝试先重新启动gulp watch-进程,但是这并没有什么不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2012-11-21
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多