Evento de criação de post do Visual Studio - Copiar para o local do diretório relativo

228

Em uma compilação bem-sucedida, desejo copiar o conteúdo do diretório de saída para um local diferente na mesma pasta "base" . Essa pasta pai é uma parte relativa e pode variar com base nas configurações do Controle de origem.

Listei alguns dos valores de macro disponíveis para mim ...

$ (SolutionDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

Quero copiar o conteúdo do Dir de Saída para a seguinte pasta:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dependency

O local base "D: \ GlobalDir \ Version \ AppName" precisa ser buscado em uma das macros acima. No entanto, nenhum dos valores da macro lista apenas o local pai.

Como extrair apenas o local base do comando post build copy?

Preets
fonte

Respostas:

188

Se nenhuma das TargetDir ou outras macros apontarem para o lugar certo, use o diretório ".." para voltar na hierarquia de pastas.

ie Use $(SolutionDir)\..\..para obter seu diretório base.


Para obter uma lista de todas as macros, consulte aqui:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx

gbjbaanb
fonte
Obrigado!! Boa dica
Merlyn007 27/02
293

Aqui está o que você deseja colocar na linha de comando do evento Pós-compilação do projeto:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

EDIT: ou se o nome do seu destino for diferente do nome do projeto.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"
Lucas B
fonte
1
Boa dica. Eu esqueci as aspas.
Matt Montag
3
Não estava funcionando para mim porque eu esqueci o /Y. Obrigado por mostrar todo o comando.
Mark
10
Pode-se utilizar xcopycom caracteres universais e os interruptores apropriados para atingir um resultado semelhante, mantendo ao mesmo tempo a estrutura da pasta de origem (árvore), tais como:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku
4
Eu sugeriria usar $ (TargetName) em vez de $ (ProjectName) na parte de origem.
Alexander Schmidt
2
atualizar para o meu anterior. Comentário: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"sem a barra invertida extra, desde $ (SolutionDir) inclui uma barra invertida (pelo menos no VS2012)
gelada
40

Você poderia tentar:

$(SolutionDir)..\..\
ichiban
fonte
8
Lembre-se de que a variável $ (SolutionDir) já possui a barra invertida. Fonte: "O diretório da solução (definido com unidade e caminho); inclui a barra invertida à direita '\'." msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker
10

Acho que isso está relacionado, mas tive um problema ao criar diretamente usando msbuild linha de comando (a partir de um arquivo em lotes) vs criar no VS.

Usando algo como o seguinte:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(observação: em start XCOPYvez de ser XCOPYusado para solucionar um problema de permissões que impedia a cópia)

A macro foi $(SolutionDir)avaliada ao ..\executar o msbuild a partir de um arquivo em lote, o que resultou na XCOPYfalha do comando. Caso contrário, funcionou bem quando criado no Visual Studio. Confirmado usando/verbosity:diagnostic para ver a saída avaliada.

O uso da macro $(ProjectDir)..\, que equivale à mesma coisa, funcionou bem e manteve o caminho completo nos dois cenários de compilação.

drzaus
fonte
1
cross-linking para o mesmo truque no caso eu esqueci de dar crédito ...
drzaus
Starttrabalhou para mim (para xcopyem uma pasta compartilhada).
AgentFire 14/06
4

Não faria sentido usar o msbuild diretamente? Se você estiver fazendo isso com cada compilação, poderá adicionar uma tarefa msbuild no final? Se você apenas deseja ver se não consegue encontrar outro valor de macro que não seja mostrado no IDE do Visual Studio, você pode ativar as opções do msbuild para diagnosticar e isso mostrará todas as variáveis ​​que você pode usar, como bem como seu valor atual.

Para ativar isso no visual studio, vá para Ferramentas / Opções, role a exibição em árvore para a seção chamada Projetos e soluções, expanda isso e clique em Construir e executar, à direita, há uma lista suspensa que especifica a verbosidade da saída da construção , definindo isso como diagnóstico, mostrará quais outros valores de macro você pode usar.

Como não sei até que nível você gostaria de ir e quão complexo você deseja que sua construção seja, isso pode lhe dar uma idéia. Eu tenho feito recentemente scripts de compilação, que até executam código SQL como parte da compilação. Se você quiser mais ajuda ou até mesmo alguns exemplos de scripts de construção, avise-me, mas se for apenas um pequeno processo que você deseja executar no final da construção, talvez o script completo do msbuild esteja um pouco exagerado. .

Espero que ajude Rihan

Rihan Meij
fonte
thx Rihan, mas aparentemente o VS 2003 não parece apoiar isso! É claro que estou muito contente com o evento pós construção ;-)
Preets
Eu não sabia que era o vs2003 e, portanto, o uso do msbuild como uma solução possível, se bem me lembro do vs2003 antes da era do msbuild? Obrigado pela resposta. Boa sorte com VS 2003, eu não olhar para trás depois de passar para VS2005
Rihan Meij