uribo / textlintr

✅ Natural Language Linter Tools for 'R Markdown' and R Code 💯
https://uribo.github.io/textlintr/
Other
8 stars 1 forks source link

Windowsでのtextlint実行環境が整っていない #15

Open uribo opened 6 years ago

uribo commented 6 years ago

5 のコメントに関連

状況

textlintr::init_textlintr()
Yeah! Install was successful

.textlint/ 以下にtextlintの実行に必要なファイルがインストールされる。一方で

Sys.which("textlint")
# ""
uribo commented 6 years ago

@niszet

file.exists(".textlintr/node_modules/textlint/bin/textlint.js") はTRUEを返しますか?

niszet commented 6 years ago

改めてインストールしなおしてみましたが、エラーメッセージは変わらず。 下記コマンドはTRUEを返しました。

> file.exists(".textlintr/node_modules/textlint/bin/textlint.js")
[1] TRUE
uribo commented 6 years ago

TRUEを返す状況でも

library(textlintr)
lint_target <-
  system.file("sample.md", package = "textlintr")
textlint(lint_target)

がエラーということでしょうか。

# processx::run("echo", "Hello R!")

~~も試してもらって良いですか? 二番目の方でもエラーになるようだと、問題はprocessxにある気がします。~~

編集

所定のパスにtextlint.jsがインストールされているので、

https://github.com/uribo/textlintr/blob/e29fd930566dc9ad87344714350aa0a42b67d6eb/R/textlintrc.R#L40-L42

は実行されている(processxが問題なく動いている)ようです。

niszet commented 6 years ago

そうです!

そして、下記もエラーとなりました…。

> processx::run("echo", "Hello R!")
Error in process_initialize(self, private, command, args, stdin, stdout,  : 
  Command not found

Terminalタブではecho使えるので、processxをもうちょっと調べたほうがよさそうですね…。

uribo commented 6 years ago

ありがとうございます。 うーん、わからなくなってきましたね。

atusy commented 4 years ago

processxの問題なら解決しているかもしれません。

Win機がへぼすぎるのかnpmのインストールがいつまでたっても終わらないので、それ以上の確認はできていません。

sessioninfo::session_info("processx")
#> - Session info ---------------------------------------------------------------
#>  setting  value                       
#>  version  R version 3.6.0 (2019-04-26)
#>  os       Windows 10 x64              
#>  system   x86_64, mingw32             
#>  ui       RTerm                       
#>  language (EN)                        
#>  collate  Japanese_Japan.932          
#>  ctype    Japanese_Japan.932          
#>  tz       Asia/Tokyo                  
#>  date     2020-08-19                  
#> 
#> - Packages -------------------------------------------------------------------
#>  package  * version date       lib source        
#>  processx   3.4.2   2020-02-09 [1] CRAN (R 3.6.3)
#>  ps         1.3.2   2020-02-13 [1] CRAN (R 3.6.3)
#>  R6         2.4.1   2019-11-12 [1] CRAN (R 3.6.2)
#> 
#> [1] C:/Users/atusy/Documents/R/win-library/3.6
#> [2] C:/Program Files/R/R-3.6.0/library
processx::run("echo", "Hello R!")
#> $status
#> [1] 0
#> 
#> $stdout
#> [1] "Hello R!\n"
#> 
#> $stderr
#> [1] ""
#> 
#> $timeout
#> [1] FALSE

Created on 2020-08-19 by the reprex package (v0.3.0)

paithiov909 commented 4 years ago

ソースコードをなんとなく眺めてきましたがこのあたりがおかしいように見えます。

search_textlint_pathが返すのはただのJSファイルで実行ファイルではないみたいなので、これはargsにわたすべきで、commandにわたすべきなのはnodeとかなような?

uribo commented 4 years ago

@paithiov909

search_textlint_pathが返すのはただのJSファイル はい。その通りです。 search_textlint_path()ではnpmのグローバルパス、作業ディレクトリのパス、ユーザが指定したパスのいずれかによってtextlint.jsを探します。

JavaScriptの知識が不足していて申し訳ないのですが

node node_modules/textlint/bin/textlint.js target.md

とした時と

# node指定なし
node_modules/textlint/bin/textlint.js target.md

では結果が同じになります。

uribo commented 4 years ago

npxを使えば良いのかな

paithiov909 commented 4 years ago
node node_modules/textlint/bin/textlint.js target.md

とした時と

# node指定なし
node_modules/textlint/bin/textlint.js target.md

では結果が同じになります。

UNIX系のOSだとこういった実行時のインタプリタを指定する小ワザがきちんと機能するため、このファイルを直接呼んでもJSとして実行できるようですが、Windows環境ではこのかぎりではありません。Windows環境でこれをシェルから実行するには頭にnodeとかnpxとかを付ける必要があります。

$ npm init -y
$ npm install textlint
$ Rscript -e "processx::run('node', args = c(file.path(getwd(), 'node_modules/textlint/bin/textlint.js'), '--help'))" ## これは動く
$ Rscript -e "processx::run(file.path(getwd() , 'node_modules/textlint/bin/textlint.js'), '--help')" ## これは動かない

Macなんかでのnpmの挙動はかえってわからないのですが、Windows環境だとnpm install textlintするとnode_modules/.bin/textlintとして、JSを実行するエイリアスみたいなのがつくられるので、これはシェルから実行可能なコマンドとして呼ぶことができます。

$ npm init -y
$ npm install textlint
$ Rscript -e "processx::run('bash', args = c(file.path(getwd(), 'node_modules/.bin/textlint'), '--help'))" ## 動く
$ Rscript -e "processx::run(file.path(getwd() , 'node_modules/.bin/textlint'), '--help')" ## 動かない
uribo commented 4 years ago

なるほど。詳細にありがとうございます。 node_modukes/.bin/textlint、macOS環境でもありました。 ただグローバルインストールしたときには /usr/local/bin/textlint でした。

npm install textlint -g
/usr/local/bin/textlint -> /usr/local/lib/node_modules/textlint/bin/textlint.js
+ textlint@11.7.6
added 201 packages from 105 contributors in 11.089s

いずれにせよ processx::run('node', args = ...)で実行するのが良さそうですね。