2017-04-10 80 views
0

作爲Qt項目部署過程的一部分,我需要將幾個文件複製到部署文件夾。我的問題是我無法使-= operator工作。我也想根據文件名過濾出特定的文件。Qt qmake:從變量中刪除條目

要重現我的問題,我已經創建了一個簡單的Qt項目,其.pro文件如下所示(請參閱「的利息部分」):

TEMPLATE = app 
QT = core 
CONFIG += console 
CONFIG -= app_bundle 
CONFIG += c++11 

SOURCES += main.cpp \ 
myfile1.cpp \ 
myfile1d.cpp 

SOURCES += myfile1.cpp 
SOURCES += myfile1d.cpp 

#portion of interest - start 
FOLDER_PATH = $$_PRO_FILE_PWD_/../files/ 

#add all files present in 'files' folder 
FILES_TO_COPY = $$FOLDER_PATH/* 

#exclude a specific file 
win32:CONFIG(release, debug|release): { 
FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt 
} 

filesToCopy.files = $$FILES_TO_COPY 
filesToCopy.path = $$_PRO_FILE_PWD_/../deploy 

INSTALLS += filesToCopy 
#portion of interest - finish 

我添加了一個「make install的」一步到在Qt Creator項目設置中構建過程。此步驟應查看.pro文件中的INSTALLS變量,並將指定的文件從'files'複製到'deploy'文件夾中。

現在,該文件夾 '文件' 包含以下文件:

  • fileb.txt
  • filec.txt
  • filecd.txt
  • filed.txt
  • filedd.txt

以下是我想要做的:

1)最初,我希望除'filecd.txt'之外的所有文件都從'文件'複製到'部署'。我正在嘗試使用' - ='來排除'filecd.txt',但我仍然在複製所有文件。

2)我也想根據名字過濾出特定的文件。例如,如果我們處於發佈模式,則不應複製文件的調試版本。這應該排除filecd.txt和filedd.txt,它們被模擬爲filec.txt和filed.txt的調試版本。

感謝您的任何幫助。

{版本信息:Qt Creator的4.2.1,基於Qt 5.8.0(MSVC 2015年,32位)

試劑盒信息:桌面的Qt 5.8.0 MSVC2015 32位)}

UPDATE: 對於其他試圖(通過經驗者及審查)做同樣的事情,這是我落得這樣做:

#add all files present in 'files' folder 
FILES_TO_COPY = $$files($$FOLDER_PATH/*) 

#From these files: fileb.txt filec.txt filecd.txt filed.txt filedd.txt 
#we only want to copy the following files to the deployment folder 
#fileb.txt filec.txt filed.txt 

#i.e., we wish to exclude these files from deployment folder: 
#filecd.txt filedd.txt 
win32:CONFIG(release, debug|release): { 
    #FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt 

    for(iter, FILES_TO_COPY): { 
     #name of one file 
     FNAME = $$iter #/path/to/filecd.txt   

     SEARCH_TOKEN = 'd.txt' 
     SECTIONS = $$split(FNAME, $$SEARCH_TOKEN)#filec d.txt 

     FNAME1 = $$first(SECTIONS) #filec   

     #if 'd.txt' is not part of the filename then split returns 
     #the filename untouched (i.e. FNAME1 would be equal to FNAME, 
     #and should be found in FILES_TO_COPY) 
     #NOTE: If we are unlucky enough to have another file called     
     #'filec' (without any extension) then the search for filecd.txt 
     #will be abandoned.   
     !contains(FILES_TO_COPY, $$FNAME1) : { 
      FILE_EXT = '.txt' 
      FNAME1D = $$join(FNAME1, , , $$FILE_EXT) #filec.txt     
      contains(FILES_TO_COPY, $$FNAME1D): { 
       REDUNDANT_FILES += $$FNAME      
      } 
     } 

    } 
} 

FILES_TO_COPY -= $$REDUNDANT_FILES 
filesToCopy.files = $$FILES_TO_COPY 
filesToCopy.path = $$_PRO_FILE_PWD_/../deploy 
INSTALLS += filesToCopy 
+0

的Qt Creator的信息是不相關的。請提供您在爲項目選擇的工具包中使用的Qt版本本身的信息。 –

+0

這是「桌面Qt 5.8.0 MSVC2015 32位」。 – user789

+0

請修改問題,而不是回覆評論:評論表示應通過編輯問題並將評論標記爲過時來解決問題中的缺陷。 –

回答

1

QMAKE執行水珠擴展文件已經被解析之後,因此當FILES_TO_COPY -= ...行被解析,該變量仍然具有未擴展glob值。

相反,使用$$files內置的測試功能來組裝文件的列表,你可以然後將其刪除:

FILES_TO_COPY = $$files($$FOLDER_PATH/*) 

win32:CONFIG(release, debug|release): { 
    FILES_TO_COPY -= $$FOLDER_PATH/filecd.txt 
} 
+0

謝謝,這已經解決了我的兩個問題中的第一個。我還沒有嘗試過,但現在應該可以解決第二個問題了。 – user789