【问题标题】:Qt qmake: removing entries from a variableQt qmake:从变量中删除条目
【发布时间】:2017-04-10 10:54:03
【问题描述】:

作为 Qt 项目部署过程的一部分,我需要将几个文件复制到部署文件夹。我的问题是我无法让-= operator 工作。我还想根据文件名过滤掉特定的文件。

为了重现我的问题,我创建了一个简单的 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

我在 Qt Creator 项目设置中的构建过程中添加了一个“make install”步骤。此步骤应查看 .pro 文件中的 INSTALLS 变量,并将指定文件从“files”复制到“deploy”文件夹。

现在,“文件”文件夹包含以下文件:

  • fileb.txt
  • filec.txt
  • 文件cd.txt
  • filed.txt
  • filedd.txt

这是我想做的:

1) 最初,我希望将除“filecd.txt”之外的所有文件从“files”复制到“deploy”。我正在尝试使用 '-=' 来排除 '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 32bit) }

更新: 对于其他尝试做类似事情的人(并供有经验的人审查),这就是我最终做的事情:

#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

【问题讨论】:

  • Qt Creator 信息无关紧要。请提供有关您在为项目选择的套件中使用的 Qt 版本本身的信息。
  • 它是“桌面 Qt 5.8.0 MSVC2015 32bit”。
  • 请修改问题而不是回复评论:评论表明问题存在缺陷,应通过编辑问题然后将评论标记为过时来解决。

标签: qt qmake


【解决方案1】:

qmake在文件解析完成后进行glob扩展,所以在解析FILES_TO_COPY -= ...行时,变量仍有未扩展的glob值。

相反,请使用$$files 内置测试函数来组合您可以从中删除的文件列表:

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

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

【讨论】:

  • 谢谢,这解决了我的两个问题中的第一个。我还没有尝试过,但我现在应该也可以解决第二个问题了。
【解决方案2】:

您可以使用正则表达式删除变量,使其更整洁:

FILES_TO_COPY ~= .*filecd.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多