Desde a versão 11, Xcode define o meu CFBundleVersion
valor para $(CURRENT_PROJECT_VERSION)
e meu CFBundleShortVersionString
ao valor $(MARKETING_VERSION)
sempre que eu entrar Versão ou valores construir no configurações de destino (guia "Geral").
A versão real e os valores de compilação inseridos agora são armazenados no arquivo project.pbxproj. Não quero ou gosto desse comportamento, pois uso scripts de shell para modificar os valores no momento da construção.
Posso definir manualmente os valores corretos no arquivo Info.plist, mas assim que altero os números de Versão ou Compilação nas configurações de destino, o arquivo Info.plist é alterado novamente pelo Xcode.
Como faço para parar o Xcode 11 de fazer isso?
Quando modifico meu script de construção para alterar o próprio arquivo do projeto, o Xcode cancelará imediatamente a construção assim que o arquivo do projeto for alterado.
fonte
plistbuddy
é agradável e limpo, enquanto que modificar o arquivo do projeto é muito mais confuso, pouco confiável e propenso a alterações inesperadas no formato do arquivo.Respostas:
A estrada até agora
Meu caso de uso foi o seguinte:
Settigns.bundle
Eu costumava executar os pontos 1 e 2 como um script de construção de destino e o ponto 3 como um script personalizado no próprio IC.
A nova maneira de armazenar a versão e compilar nas configurações de compilação do Xcode estava causando problemas nos scripts, porque eles não eram mais capazes de modificar efetivamente os valores. Pelo menos a leitura era possível.
Infelizmente, não consegui descobrir uma maneira legítima de impedir o Xcode de armazenar a versão e criar números nas configurações de compilação do projeto, no entanto, consegui criar uma solução alternativa.
Acontece que, quando uma compilação ou arquivamento é feita, o valor escrito em
Info.plist
é usado. Isso significa que o valor é substituído durante o tempo de construção, o que não nos permite modificá-lo durante o mesmo tempo de construção.Também tentei modificar o projeto usando o
xcodeproj
cli, no entanto, qualquer alteração no projeto estava causando a interrupção de qualquer compilação, portanto, esta solução não estava funcionando.Eventualmente, depois de várias abordagens diferentes que tentei, finalmente consegui encontrar um compromisso que não estava violando o novo comportamento do Xcode.
Resposta curta:
Como uma ação prévia do alvo, é executado um script que grava os respectivos valores para
CFBundleShortVersionString
eCFBundleVersion
para oInfo.plist
Como fonte da verdade, eu uso as configurações de compilação do Xcode para ler os valores de
MARKETING_VERSION
eCURRENT_PROJECT_VERSION
do destino desejado.Dessa forma, quando você modificar os valores das configurações do projeto - na próxima compilação / arquivamento - eles serão gravados no
Info.plist
, permitindo que qualquer uma, se sua lógica de script existente, continue a funcionar.Resposta detalhada
A única maneira de modificar um recurso em uma ação de construção é usando um
pre-action
script. Se você tentar fazer isso a partir de um script de construção - as alterações não entrarão em vigor imediatamente e não estarão presentes no final da construção / arquivamento.Para adicionar uma ação de pré-construção - vá para o esquema de edição.
Expanda as seções Build e Archive. Em
Pre-action
, clique noProvide build and settings from
menu suspenso e selecione a fonte do destino da verdade a partir da qual você deseja ler os valores.Adicione o seguinte script:
As linhas de script fazem o seguinte:
MARKETING_VERSION
eCURRENT_PROJECT_VERSION
A etapa final é escrever seu próprio script de sincronização que leia os valores do fornecido
MARKETING_VERSION
eCURRENT_PROJECT_VERSION
para o (s) destino (s) respectivo (s) e sempre que desejar.No meu caso, o script é o seguinte:
Eu uso compartilhado
Info.plist
eSettings.bundle
entre os dois destinos de aplicativos, por isso preciso atualizá-lo uma vez.Também uso uma extensão de serviço de notificação
BadgeCounter
, que precisa ter exatamente a mesma versão e compilar como o destino no qual está incorporada. Então eu atualizo isso também.fonte
Não.
Presumivelmente, há uma razão pela qual esse comportamento mudou. Se os recursos posteriores do Xcode se basearem nesse comportamento, as coisas serão cada vez mais "construídas" na linha.
Em vez de tentar dobrar o Xcode, altere como o script de construção recupera esses valores:
Como ler a versão atual do aplicativo no Xcode 11 com script
Se você precisar manipular o
project.pbxproj
arquivo, é uma lista de estilo Próximo que está bem documentada. Você pode usar oplistbuddy
que é compatível com este formato antigo. Você também pode usarawk
com mais scripts se tiver manipulações mais complexas.Se eu entendo o seu caso de uso, você pode escrever um script que obtenha os números de versão mais altos
awk
e, em seguida, atualize todos os números de versão inferiores que pode encontrar no arquivosed
.fonte
PlistBuddy
parece funcionar bem, mas quando eu uso oset
comando, todo o project.pbxproj é convertido em um arquivo .plist XML e não pode mais ser lido pelo Xcode. exemplo:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
arquivo, a construção será cancelada. Receio que isso não vá realmente funcionar.