Ant: scp create directory if not exist

前端 未结 2 1957
猫巷女王i
猫巷女王i 2021-01-21 18:17

I am using this to copy from A to B. But if for example the folder /config doesnt exist it gives me an exception. How can I solve it? I tried mkdirs=\"true\" but it runs to erro

相关标签:
2条回答
  • 2021-01-21 19:02

    You can use sshexec to create directories tree on remote machine before coping. mkdir -p creates directories if not exists. (How to mkdir only if a dir does not already exist?)

    <sshexec
        host="${host}"
        username="${remote_user}"
        password="${remote_password}"
        command="mkdir -p ${remote_dir_path}"
        trust="true" />
    

    Add it to your target before scp

    0 讨论(0)
  • 2021-01-21 19:08

    It's not possible to create remote directories with scp task. Here's a macrodef for scptransfer, that does all the work needed for transfer from a given stagedirectory => fix linefeeds, createremote, deleteremote, fail if stagedir empty ... etc. Macrodef is using ant addon Flaka, if you don't need all that bells and whistles, simply use sshexec task with mkdir -p before scp to create your remote targetdir.

    <project xmlns:fl="antlib:it.haefelinger.flaka">
    
    <fl:install-property-handler/>
    
    <macrodef name="scptransfer">
     <attribute name="host" default="${aix.host}"/>
     <attribute name="userid" default="${aix.userid}"/>
     <attribute name="knownhosts" default="${aix.knownhosts}"/>
     <attribute name="ppk" default="${aix.ppk}"/>
     <attribute name="createremote" default="false"/>
     <attribute name="remotedir" default="${eartarget}/${project}/${env}/${module}/${job.id}"/>
     <attribute name="deleteremote" default="false"/>
     <attribute name="deleteincludes" default="*"/>
     <attribute name="stagedir" default="${artifactdir}/${module}"/>
     <attribute name="stageincludes" default="**/*.*"/>
     <attribute name="stageexcludes" default=""/>
     <attribute name="failstageempty" default="true"/>
     <attribute name="fixLF" default="false"/>
     <attribute name="timeout" default="900000"/>
     <attribute name="verbose" default="true"/>
    
     <sequential>
       <echo>
       =============== SCP Transfer ===============
        Project          = ${project}
        Environment      = ${env}
    
        UserID           = @{userid}
        Targetserver     = @{host}
        Targetpath       = @{remotedir}
        fixLF ?          = @{fixLF}
        createremote ?   = @{createremote}
        deleteremote ?   = @{deleteremote}
        #{@{deleteremote} ? 'deleteincludes   = @{deletecincludes}' : '' }
        Stagedir         = @{stagedir}
        stageincludes    = @{stageincludes}
        stageexcludes    = @{stageexcludes}
       =============== SCP Transfer ===============
       </echo>
       <!-- contents in stagedir ? -->
       <resourcecount property="stagecount">
        <fileset dir="@{stagedir}" includes="@{stageincludes}" excludes="@{stageexcludes}" id="stagecontents"/>
       </resourcecount>
         <fl:choose>
           <fl:when test=" ${stagecount} > 0 ">
             <!-- Fix Linefeeds for ASCII Files -->
             <fl:when test=" @{fixLF} ">
               <fixcrlf
                 excludes="**/*.jar **/*.tar **/*.zip **/*.ear **/*.class"
                 srcdir="@{stagedir}"
                 eol="lf"
                 eof="remove"
                 fixlast="true"
               />
             </fl:when>
             <!-- // T i m e o u t -->
             <parallel threadcount="1" timeout="@{timeout}">
               <!-- create remotedir ? -->
               <fl:when test=" @{createremote} ">
                 <sshexec host="@{host}"
                      username="@{userid}"
                      knownhosts="@{knownhosts}"
                      keyfile="@{ppk}"
                      command="mkdir -p @{remotedir}"
                 />
               </fl:when>
               <!-- delete contents in remotedir ?
                will throw error if remotedir doesn't exist ! -->
               <fl:when test=" @{deleteremote} ">
                 <sshexec host="@{host}"
                      username="@{userid}"
                      knownhosts="@{knownhosts}"
                      keyfile="@{ppk}"
                      command="cd @{remotedir};rm -rfe @{delfilepattern}"
                 />
               </fl:when>
               <!-- Filetransfer from stagedir -->
               <scp todir="@{userid}@@@{host}:@{remotedir}"
                    keyfile="@{ppk}"
                    knownhosts="@{knownhosts}"
                    sftp="true"
                    verbose="@{verbose}"
               >
                 <fileset refid="stagecontents"/>
               </scp>
             </parallel>
             <!-- T i m e o u t // -->
           </fl:when>
           <fl:otherwise>
             <echo>
             =============== SCP Transfer =============
                   Skip => NO StageDirContents !!
             =============== SCP Transfer =============
             </echo>
             <fl:fail message="Stagedir [@{stagedir}] empty !!" test=" @{failstageempty} "/>
           </fl:otherwise>
         </fl:choose>
     </sequential>
    </macrodef>
    
    </project> 
    

    As we switched to Github only recently get the manual here and some examples here.

    0 讨论(0)
提交回复
热议问题