2

레일스 응용 프로그램 내에서 자산 사전 컴파일 작업을 실행하고 싶습니다. 코드를 변경할 사람이 많기 때문에 언제든지 변경할 때마다 항상 스크립트를 실행해야합니다. 나는레일 응용 프로그램 내에서 레이크 작업 실행

system("Template='#{params[:template]}' Theme='#{params[:theme]}' rake assets:precompile) 

내가 UI에서 두 값을 얻고 같은 몇 가지 매개 변수를 사용하여 작업을 실행하는 UI를 구축, 그래서 그들은 혼자 스크립트를 실행할 수 있습니다에서 그들에 대한 GUI를 제공하고 그들에게 서버 액세스 권한을 부여, 그래서 (params [: template], params [: theme]) 다른 경로 (사이트 경로)에서이 작업을 실행하고 싶은 또 다른 사항은 관리자 측 UI가 해당 작업이 사이트 디렉토리에서 실행되어야 함을 의미합니다.

if(params[:theme_script] == "true") 
     template=Template.where(:name => params[:template]).first 
    if template 
     theme = template.themes.where(:name => params[:theme]).first 
     if theme 
    # Dir.chdir "#{THEMEPATH}"do 
    #  `Template="#{template.name}" Theme="#{theme.name}" rake assets:precompile` 
    # end 
    #  sleep 10 
    #  system("#{Rails.root.to_s}/lib/shell_script.sh") 
    #  RunRake.run_rake(template.name,theme.name) 
    # Dir.chdir "#{THEMEPATH}"do 
    #  Rake::Task['assets:precompile'].invoke 
    # end 
      ENV["Template"] = template.name 
      ENV["Theme"] = theme.name 
      precompile_task = "bundle exec rake assets:precompile --trace 2>&1" 
      output = Dir.chdir(THEMEPATH) { %x[ #{precompile_task} ] } 
      flash[:notice] = "Asset created successfully" 
     else 
     flash[:notice] = "U have enter invalid data" 
     end 
    else 
     flash[:notice] = "U have enter invalid data" 
    end 
    end 

이것은 내 코드가 여러 조건을 검사하고 해당 작업을 실행할 수 있도록 허용하고 있습니다.

컨트롤러와 lib를 넣음으로써이 코드를 시도했지만 작동하지 않습니다.

나는 또한 쉘 스크립트로 시도했다.

아무도 도와 줄 수 없습니까?

+0

가 있다고 * 정말로 * 자산 컴파일이 사용되는 방법이 아닙니다. 배포 스크립트를 통해 배포 시간에 자동으로이 작업을 수행해야합니다. 이를 위해 GUI를 원할 이유가 없어야합니다. – meagar

+0

답장을 보내 주셔서 감사합니다. 코드를 변경할 많은 의존성이 있었기 때문에 언제든지 스크립트를 실행할 필요가 있습니다. 서버에 액세스 할 수 없기 때문에 을 입력하여 GUI를 제공하고 있습니다. 그들 만이 스크립트를 실행할 수 있습니다. – Jenorish

+0

@ МалъСкрылевъ 어떻게 파라미터를 전달할 수 있습니까? – Jenorish

답변

5

에 대한 환경 변수를 설정 한 다음 컨트롤러에서 #invoke 메서드를 발행 할 수 있습니다. 그래서, 파일을 준비 :

gem 'rake' 

설정/초기화/rake.rb :

Rake.load_rakefile Rails.root.join('Rakefile') 

응용 프로그램/컨트롤러/your_controller :

ENV["Template"] = template.name 
ENV["Theme"] = theme.name 
Rake::Task[ 'assets:precompile' ].invoke 

Rake::Task.tasks.map(&:name).grep 'assets:precompile' 
# => ["assets:precompile"] 

당신이 볼 수 있듯이, assets:precompile이 성공적으로로드 작업 :

문제 bundle install, 다음 콘솔 rails c 및 유형을 실행합니다. 그런 다음 컨트롤러에 대한 작업을 실행하십시오. 당신이했던 것처럼

유사한 당신은 또한 다른 인스턴스를 실행 쉘을 타 앱에 대한 작업을 실행하려면 :

system("other_app_run.sh '#{template.name}' '${theme.name}'") 

other_app_run.sh :

#!/bin/bash 

source "$HOME/.rvm/scripts/rvm" 
cd /other/app/path 
export Template="$1" 
export Theme="$2" 
rake assets:precompile 
+0

나는 내 질문을 편집하고 내 코드를 올렸습니다. 어떻게 노력하고 있습니까? 확인하고 도와주세요. – Jenorish

+0

@Kingston 글쎄, 질문은 똑같습니다. 호출은 어떻게됩니까? –

+0

Command가 상태 (1)로 실패했습니다. [/home/kingston/.rvm/rubies/ruby-1.9.3-p448/...], 응용 프로그램이 이미 초기화되었습니다. SystemExit가 발생했습니다. 번역에서 # excecute : exit ,, .... 정의되지 않은 메소드'each_logical_path for nil : NilClassadmin side 자산 개념을 사용하지 않았습니다. config.assets.enabled = false 있습니다. 디렉토리가 있다고 생각합니다. 변화하지 않는다. – Jenorish