2016-12-26 8 views
1

build.gradleファイルに2つのgradleタスクがあります.1つはフォルダをアーカイブし、もう1つはリモートサーバーにプッシュします。私はgradle tarTaskとし、コメントアウトpublishタスク単独でtarTaskを実行した場合依存関係として追加された場合、Gradleタスクが実行されない

task tarTask(type: Exec) { 
    commandLine 'tar', '-czf', 'javadocs.tgz', 'javadocs/' 
} 

、ビルドが成功します。 このタスクは、公開タスクの依存関係として使用しています。

task publish(dependsOn: tarTask) { 
    ssh.run { 
     settings { 
      knownHosts = allowAnyHosts 
      fileTransfer = 'scp' 
     } 

     session(remotes.webServer) { 
      from: 'javadocs.tgz', into: 'publishingHouse/' 
     } 
    } 
} 

しかし、私はgradle publishを実行したとき、前のタスクが実行された場合に作成されている必要がありtgzファイルを見つけることができないことを言って失敗しました。

java.io.FileNotFoundException:javadocs.tgz私は私がここで行方不明です本当にわからないのGradleする新しいビーイング

。私が何をすることができるかについてのアイデア?

+0

tarタスクでは何が「javadocs /」となりますか?それはタールがそのフォルダに保存されていることを意味しますか?おそらく、あなたは公開タスクで 'javadocs/javadocs.tgz'を使うべきでしょうか? – AdamSkywalker

+0

@AdamSkywalker 'javadocs /'は、アーカイブするフォルダの名前です。つまり、 'javadocs'フォルダを' javadocs.tgz'としてアーカイブします。ですから、公開タスクでの作業はうまくいきます。ファイルが存在すれば正常に動作します。 –

+0

gradle publishを実行すると、tarTaskが実行されたか、またはスキップされたというコンソールメッセージが表示されますか? – AdamSkywalker

答えて

2

タスクが実行されたときにその理由が考えられるとします。 tarTaskは構成フェーズで構成され、実行フェーズで実行されます。

同時に、実行フェーズで実行する動作はありませんが、publishのタスクは実行中に実行されるため、ssh.runが実行されます。

これは、gradle publishを実行すると、tar-archiveをコピーするロジックが構成フェーズで実行されますが、tar-archiveはまだ存在しません(後で実行フェーズで作成される)ことを意味します。

task publish(dependsOn: tarTask) << { 
    ssh.run { 
     settings { 
      knownHosts = allowAnyHosts 
      fileTransfer = 'scp' 
     } 

     session(remotes.webServer) { 
      from: 'javadocs.tgz', into: 'publishingHouse/' 
     } 
    } 
} 

注意を、<<doLastと同じで、閉鎖がでexcutedされることを次のようにあなたは、単にpublishタスクの宣言に<<を追加することができます実行フェーズでコピー実行を行うことが

実行段階。 Gradleのビルドライフサイクルについて読むことができますhere

+0

はい、正当なようです。 – AdamSkywalker

+0

@Stanislav、あなたは 'ssh.run'が設定段階で起こることをどのように知っていましたか?それはデフォルトの動作ですか、それともコード内にある何かのためですか? –

+0

これは 'sshだからです。run'は即座に実行され、その後、タスククロージャ内に配置され、 '<<'なしに設定中に呼び出されます。 – Stanislav

関連する問題