Waitforexit Nant




Waitforexit NantFale sobre novato. Eu sou novo em tudo e estou tendo problemas no momento. Eu tenho um programa C que eu quero executar NAnt. A ferramenta de construcao. Agora, obter um programa C para executar um programa e direto, mas para que ele execute um programa e passar nesse programa, um arquivo e diferente. Veja, NAnt e executado em uma janela de linha de comando. O meu programa C DEVE executar NAnt na janela da linha de comando e passa-lo um argumento que sera o arquivo. build para compilar e construir. Obviamente, o NAnt leva o arquivo. build e executa acoes de construcao, entao apenas abrir o arquivo. build do programa C nao invoca NAnt para fazer isso. Como faco para isso, minha fraca tentativa, composta de bits de codigo encontrado e minhas proprias modificacoes: string targetDir targetDir string. Format (quotC: Documents and SettingsHPAdministratorMy DocumentsYEAR 6Sem1PROJDeliverMinTestMinTestMinTestquot) compilador new Process () necessario para iniciar o NAnt executando como Um processo, direito compiler. StartInfo. WorkingDirectory targetDir compiler. StartInfo. FileName quotNAnt. exequot a ferramenta para executar na compilacao de linha cmd. StartInfo. Arguments quotdefault. buildquot o arquivo de compilacao para passar para NAnt no compilador de linha cmd. StartInfo. UseShellExecute Forcas verdadeiras o cmdline a ser usado, compiler. StartInfo. RedirectStandardOutput compilador falso. Start () quarta-feira, 2 de abril de 2008 4:08 Voce tem alguns erros simples em seu arquivo de compilacao. Entao, eu vou passar por cima das suas perguntas um por vez. Re: Eu nao quero executar o aplicativo o tempo todo, basta construi-lo, mas quando eu retirar (3) a parte responsavel por executar o programa construido, o arquivo de compilacao nao faz mais nada. E como se esvaziei todo o arquivo. build. O problema aqui e que o objetivo padrao do projeto, especificado na propriedade quotdefaultquot: ltproject namequotMinTestquot defaultquotrunquotgt e o destino quotrunquot. Entao, uma vez que voce remove esse alvo, nada acontece. Voce tem duas opcoes: Mude o alvo padrao para qualquer outro alvo que deseja executar. Lembre-se de que a configuracao do quotnantTargetquot pode passar para a funcao, passar o alvo que deseja executar. Outro problema e que o quotrunquot de destino padrao atual depende do quotbuildquot target: Se voce quiser apenas criar, mas nao executar, substitua o nome do arquivo lttarget dependquotbuildquotgt ltexec programquotbin. exequot basedirquot. quotgt lttarget namequotrunquot dependequotbuildquotgt lttargetgt make quotbuildquot o alvo padrao como em: ltproject namequotMinTestquot defaultquotbuildquotgt ou chame o destino quotbuildquot diretamente como descrito em 2 acima. Re: Se eu quiser apenas limpar arquivos ja na pasta bin (deixar apenas o alvo 1 e excluir 2 e 3, etc.), ele nao os exclui. O mesmo que o anterior se aplica aqui, altere o alvo padrao para quotcleanquot ou chame o quotcleanquot do seu script. Por sinal, se voce estiver em algum lugar perto da area de Waltham, MA neste fim de semana, estarei falando sobre o NAnt neste ano New England Code Camp. Devo ser divertido e posso tornar a apresentacao disponivel no meu blog depois disso. Quinta-feira, 03 de abril de 2008 11:52 PM Meu palpite e que NAnt. exe e default. build estao em diretorios separados. Talvez seja necessario especificar o diretorio de um ou outro dos arquivos. A instancia do Processo estara procurando por esses dois arquivos no mesmo diretorio. No entanto, voce tem a ideia certa. Algumas outras coisas, se NAnt for um utilitario de linha de comando, nao ha motivo para chamar Console. WriteLine (compilador. StandardOutput. ReadToEnd ()), ou defina RedirectStandardOutput como falso ou configure UseShellExecute como verdadeiro. Essas coisas ja devem estar configuradas para que voce mostre os resultados em uma janela de console. Alem disso, voce nao precisa usar string. Format ou declarar a variavel targetDir em uma linha separada. Voce poderia facilmente colocar algo como quotestring targetDir quotC: Documents. (Bla bla). MinTestquotquot Mais uma coisa, por curiosidade, por que voce esta usando NAnt, quando voce tem o compilador c maravilhoso em seu computador. Verifique as subpastas de C: WindowsMicrosoftFrameworkv2.0.50727 ou C: WindowsMicrosoftFrameworkv3.0 ou 3.5. Voce deve encontrar o compilador do Microsoft C por baixo. Quarta-feira, 02 de abril de 2008 4:43 AM Aqui esta uma funcao que uso. Demora um StringDictionary como parametros e executa uma tarefa NAnt com um determinado arquivo de compilacao. A parte que e mais relevante para voce e o codigo no bloco trycatch. vazio runTask (parametros StringDictionary) Cadeia TargetDirectory corda parametersquottdirquot public static TargetSite parametersquottsitequot. ToLower () string string parametersquotvdirquot virtualdirectory nantDirectory Pathbine (TargetDirectory, parametersquotnantdirquot) Cadeia nantBuildFile Pathbine (TargetDirectory, parametersquotnantfilequot) Cadeia nantTarget corda parametersquotnanttargetquot SMTPServer parametersquotsmtpserverquot if (targetSite. StartsWith (quotlmquot )) TargetSite targetSite. Replace (quotlmquot, quotquot) if (Directory. Exists (nantDirectory)) lancar novo DirectoryNotFoundException (string. Format (quotCould nao encontrar o diretorio NAnt ().quot, nantDirectory)) if (File. Exists (nantBuildFile) ) Lancar novo FileNotFoundException (string. Format (quotCould nao encontrar o arquivo de compilacao NAnt ().quot, nantBuildFile)) try string nantArguments quot-q - nologo - D: targetSitequotquot targetSite quotquot - D: virtualDirectoryquotquot virtualDirectory quotquot - D: smtpServerquotq Uot smtpServer quotquot - buildfile: quotquot nantBuildFile quotquot quot nantTarget processo Processo novo processo () process. StartInfo. FileName Pathbine (nantDirectory, quotnant. exequot) process. StartInfo. Arguments nantArguments process. StartInfo. UseShellExecute processo falso. StartInfo. RedirectStandardOutput processo verdadeiro. StartInfo. CreateNoWindow true process. Start () process. WaitForExit () string nantOutput process. StandardOutput. ReadToEnd () if (string. IsNullOrEmpty (nantOutput)) lancar nova Excecao (a tarefa quotNAnt falhou: quot Environment. NewLine nantArguments Environment. NewLine quotwith outputquot Environment. NewLine nantOutput) catch (excecao de excecao) lancar nova Excecao (exception. ToString ()) quarta-feira, 02 de abril de 2008 11:23 Oi, obrigado pela sua resposta. Veja a minha postagem acima, por favor, para o meu progresso. Eu entendi que meu programa C executa NAnt e NAnt executa o arquivo makefile default. build, que por sua vez cria e compila o programa C MinTest. Mas eu quero garantir que estou fazendo isso direito e nao fazendo alguma solucao alternativa. Parece que funciona de maneira diferente de voce, e isso e o que me preocupa. Voce esta atribuindo uma propriedade Arguments a um monte de argumentos (-d: TargetSite, etc.), enquanto que agora nao estou. Estou executando NAnt ONTARGETED no diretorio onde o arquivo. build e encontrado, e eu acho que NAnt esta apenas executando qualquer arquivo. build que ele encontra nesse diretorio. Na publicacao acima, mencionei que NAnt vem descompactando quando ha dois arquivos de compilacao na mesma pasta. Isso pode prejudicar meu programa. Eu preciso de uma solucao para isso, nao uma solucao alternativa - que e o que eu sinto que estou fazendo agora mesmo. Eu sinto que eu deveria estar fornecendo o arquivo. build como um argumento e nao deixar o NAnt para executar automaticamente o arquivo. build que encontra em uma pasta. E se dois arquivos do. build estiverem em um diretorio Meu programa vai cair. Desculpe, eu sou novato nao tecnologico, e eu nao sei se estou fazendo isso tudo bem. Quarta-feira, 02 de abril de 2008 1:55 PM Ok, nao ha problema. Eu revisei a funcao para suas necessidades. Voce chamaria da seguinte maneira: Declare as variaveis ??locais com o seu caminho para NAnt, arquivo de compilacao e string de destino opcional nantDirectory quotC: Documents and SettingsHPAdministratorMy DocumentsYEAR 6Sem1PROJProgramsNantExtractednant-0.85-rc4binquot string nantBuildFile quotpathtoyourbuildFile. buildquot string nantTarget quotrunquot string nantOutput String. Empty Executar o NAnt Crie o arquivo com o padrao nantOutput runTask (nantDirectory, nantBuildFile, null) Especifique o destino para executar dentro de seu arquivo de compilacao nantOutput runTask (nantDirectory, nantBuildFile, nantTarget) E aqui a funcao revisada: runTask de string publica (String nantDirectory, String buildFile, String NantTarget) string nantOutput String. Empty if (Directory. Exists (nantDirectory)) lancar novo DirectoryNotFoundException (string. Format (quotCould nao encontrar o diretorio NAnt ().quot, nantDirectory)) se (File. Exists (nantBuildFile)) lancar FileNotFoundException novo (String. Format (nao pode encontrar o arquivo de compilacao NAnt ().quo T, nantBuildFile)) try string nantArguments quot-q - nologo - buildfile: quotquot nantBuildFile quotquotquot Anexe o alvo se um foi especificado se (String. IsNullOrEmpty (nantTarget)) nantArguments quot quotquot nantTarget quotquotquot Processo Processo novo Processo () process. StartInfo. FileName Pathbine (nantDirectory, quotnant. exequot) process. StartInfo. Arguments nantArguments process. StartInfo. UseShellExecute false process. StartInfo. RedirectStandardOutput true process. StartInfo. CreateNoWindow true process. Start () process. WaitForExit () nantOutput process. StandardOutput. ReadToEnd ( ) Catch (Exception exception) throw new Exception (exception. ToString ()) Eu sabia que era cauteloso. Bem, eu obter resultados diferentes quando eu corro variacoes deste arquivo de construcao: ltxml versionquot1.0quotgt ltproject namequotMinTestquot defaultquotrunquotgt ltproperty namequotbasenamequot valuequotMinTestquotgt ltproperty namequotdebugquot valuequottruequotgt lttarget namequotcleanquotgt excluir arquivos na pasta bin (1) ltdeletegt ltfilesetgt ltinclude namequotbin. exequotgt ltinclude namequotbin. pdbquotgt ltfilesetgt Ltdeletegt lttargetgt fim de excluir arquivos na pasta bin (1) lttarget namequotbuildquotgt criar e compilar o aplicativo (2) ltmkdir dirquotbinquot gt ltcsc targetquotexequot outputquotbin. exequot debugquot quotgt ltsourcesgt ltinclude namequotMinClients. csquotgt ltinclude namequotClients. csquotgt ltinclude namequotMinClients. Designer. csquotgt (2 ) Ltsourcesgt ltcscgt lttargetgt final de compilacao e compilar o aplicativo lttarget namequotrunquot dependequotbuildquotgt executar o aplicativo (3) ltexec programquotbin. exequot basedirquot. quotgt lttargetgt final da execucao do aplicativo (3 ) Ltprojectgt Eu uso o arquivo como esta acima, e eu tenho variacoes dele, onde eu so quero que ele seja LIMPIO, LIMPIAR E CONSTRUIR, MAS NAO EXECUTAR O PROGRAMA, etc. Isso nao funciona nas seguintes circunstancias: - Eu nao quero executar O aplicativo o tempo todo, basta compila-lo, mas quando eu retirar (3) a parte responsavel pela execucao do programa construido, o arquivo de compilacao nao faz mais nada. E como se esvaziei todo o arquivo. build. - Se eu quiser apenas limpar arquivos ja na pasta bin (deixar apenas o alvo 1 e excluir 2 e 3, etc.), ele nao os exclui. No entanto, quando eu executo NAnt limpo no diretorio bin FROM THE COMMANDLINE WINDOW, ele exclui os arquivos bem. Mas, nao e como se o programa C (o bloco com o Processo) nao funcionasse AT ALL. Pode criar os arquivos se o diretorio estiver vazio primeiro. Nao parece substituir os arquivos tambem. Quinta-feira, 03 de abril de 2008 11:38 PM Voce tem alguns erros simples em seu arquivo de compilacao. Entao, eu vou passar por cima das suas perguntas um por vez. Re: Eu nao quero executar o aplicativo o tempo todo, basta construi-lo, mas quando eu retirar (3) a parte responsavel por executar o programa construido, o arquivo de compilacao nao faz mais nada. E como se esvaziei todo o arquivo. build. O problema aqui e que o objetivo padrao do projeto, especificado na propriedade quotdefaultquot: ltproject namequotMinTestquot defaultquotrunquotgt e o destino quotrunquot. Entao, uma vez que voce remove esse alvo, nada acontece. Voce tem duas opcoes: Mude o alvo padrao para qualquer outro alvo que deseja executar. Lembre-se de que a configuracao do quotnantTargetquot pode passar para a funcao, passar o alvo que deseja executar. Outro problema e que o quotrunquot de destino padrao atual depende do quotbuildquot target: Se voce quiser apenas criar, mas nao executar, substitua o nome do arquivo lttarget dependquotbuildquotgt ltexec programquotbin. exequot basedirquot. quotgt lttarget namequotrunquot dependequotbuildquotgt lttargetgt make quotbuildquot o alvo padrao como em: ltproject namequotMinTestquot defaultquotbuildquotgt ou chame o destino quotbuildquot diretamente como descrito em 2 acima. Re: Se eu quiser apenas limpar arquivos ja na pasta bin (deixar apenas o alvo 1 e excluir 2 e 3, etc.), ele nao os exclui. O mesmo que o anterior se aplica aqui, altere o alvo padrao para quotcleanquot ou chame o quotcleanquot do seu script. Por sinal, se voce estiver em algum lugar perto da area de Waltham, MA neste fim de semana, estarei falando sobre o NAnt neste ano New England Code Camp. Devo ser divertido e posso tornar a apresentacao disponivel no meu blog depois disso. Quinta-feira, 03 de abril de 2008 23:52 Boyan, apenas uma atualizacao rapida sobre o progresso. Voce percebe que voce esta potencialmente salvando um diploma (projeto do ano final da dissertacao). Eu nao posso agradecer o suficiente. TAMBEM, voce me alertou sobre o significado do atributo padrao do tag ltprojectgt. Eu tentei uma das suas dicas, e meu programa agora exclui o MinTest. exe e MinTest. pdb da bandeja. Ha mais testes que eu preciso executar, mas isso e mais progresso do que eu fiz todo o dia. PS: Eu nao posso acreditar nisso na INTERNET, ha menos forumites em foruns de programacao do que nos foruns de fofocas de celebridades ou foruns de depressao, etc. Aprendo espanhol e vou em um forum venezuelano para falar sobre o lobo ditador esquerdista em roupas de carneiros, Chavez, e ha 1 resposta a cada 3 minutos (e 13 a populacao nao tem eletricidade). Isso nao faz sentido. Entao, eu realmente aprecio voce pesando aqui, porque sabe o quanto eu esperaria. Oh, bem, durante a noite, a programacao agora. Sao 3:10 da manha. Eu adoraria ir a sua conferencia - engracado, voce deve mencionar a Nova Inglaterra. Estou na Inglaterra antiga. Sim, eu moro em Londres, Reino Unido, entao eu nao posso. Fique por perto, talvez eu precise emprestar-lhe novamente. Obrigado por toda sua ajuda (e o outro cara que postou aqui). Sexta-feira, 04 de abril de 2008 2:20 AM Voce e bem-vindo. Se voce ainda nao pudesse contar, adoro programar e adoro NAnt. E uma ferramenta muito poderosa que muitas pessoas nao conhecem. Se voce precisar de ajuda mais imediata, va para blog. tech-cats e use o widget de bate-papo, estou quase sempre online. Sexta-feira, 04 de abril de 2008 2:52 AM A Microsoft esta realizando uma pesquisa on-line para entender sua opiniao sobre o site da Msdn. Se voce optar por participar, a pesquisa on-line sera apresentada quando voce deixar o site Msdn. Voce gostaria de participar. Eu tenho trabalhado para trazer o tempo de compilacao para o nosso desenvolvedor enfrentando a construcao para algo menos de 5 minutos. Acabei recentemente de ter menos de 5. Atualmente, nao faz nada de bom gosto, como Simian, NDepend ou FXCop. Eu tenho experimentado com uma tarefa exec estendida: asynexec. Ele envolve a tarefa core exec comecando base. ExecuteTask em um novo topico. Tem um atributo adicional que deve ser definido: nome da tarefa. Taskname e usado para rastrear o topico. Isso habilita a outra tarefa que eu criei: waitforexit. Estas duas tarefas podem ser usadas em concertos, assim: lt asyncexec taskname 8220 UnitTests 8220 failonerror 8220 False 8220 resultproperty 8220 UnitTestsResult 8220 gt lt arg line 8220 - buildfile:.PackagesMSTestUnitTest. Target. xml 8220 gt lt arg line 8220 UnitTest. RunTests 8220 gt Lt arg line 8220 - logger: NAnt. Core. XmlLogger 8220 gt lt arg line 8216 - logfile: 8221 UnitTests. xml8221 8216 gt lt asyncexec gt lt waitforexit gt lt nome de tarefa gt lt valor da cadeia 8220 UnitTests 8220 gt lt tasknames gt lt waitforexit gt lt Mensagem de falha 8220 Atleast um teste de unidade falhou 8220 gt Funcionalmente, isso ira comportar o mesmo que simplesmente chamar essa tarefa exec. As coisas ficam interessantes quando voce comeca a fazer mais: lt asyncexec taskname 8220 UnitTests 8220 program 8220 8220 failonerror 8220 False 8220 resultproperty 8220 UnitTestsResult 8220 gt lt arg line 8220 - buildfile:.PackagesMSTestUnitTest. Target. xml 8220 gt lt arg line 8220 UnitTest. RunTests 8220 Gt lt arg line 8220 - logger: NAnt. Core. XmlLogger 8220 gt lt arg line 8216 - logfile: 8221 UnitTests. xml8221 8216 gt lt asyncexec gt lt asyncexec nome da tarefa 8220 Simian 8220 programa 8220 8220 failonerror 8220 Falso 8220 gt lt arg line 8220 - Buildfile:.PackagesSimianSimian. Target. xml 8220 gt lt arg line 8220 Simian. Run 8220 gt lt arg line 8220 - logger: NAnt. Core. XmlLogger 8220 gt lt arg line 8216 - logfile: 8221 Simian. xml8221 8216 gt lt asyncexec gt lt Asyncexec taskname 8220 NDepend 8220 programa 8220 8220 failonerror 8220 Falso 8220 gt lt arg line 8220 - buildfile:.PackagesNDependNDepend. Target. xml 8220 gt lt arg line 8220 nDepend. Calculate 8220 gt lt arg line 8220 - logger: NAnt. Core. XmlLogger 8220 gt lt arg linha 8216 - logfile: 8221 NDepend. xml8221 8216 gt lt asyncexec gt lt waitforexit gt lt nome de tarefa gt lt valor da cadeia 8220 Simian 8220 gt lt valor da cadeia 8220 UnitTests 8220 gt lt valor da cadeia 8220 NDepend 8220 gt lt nome de tarefa gt lt Waitforexit gt lt falha na mensagem 8220 Pelo menos uma unidade de teste falhou 8220 gt Isto salvou cerca de 35 segundos no nosso servidor de compilacao do antigo caminho: lt call target 8220 UnitTest. RunTests 8220 gt lt target target 8220 Simian. Run 8220 gt lt target target 8220 nDepend. Calcular 8220 gt. Eu passei algum tempo brincando com a melhor maneira de usar isso. Usamos o CI Factory neste projeto. Eu trago isso porque dara alguns antecedentes sobre como o script de compilacao e configurado. Existe um alvo analogo ao sub Main. Neste destino principal, os alvos dos Pacotes sao chamados. A tabela abaixo contem informacoes de tempo sobre esses destinos: como os objetivos coloridos sao executados ao mesmo tempo. Eu executei os scripts muitas vezes para ter uma ideia de qualquer variacao. Os dados acima sao de corridas medias. As coisas pareciam muito boas ate eu adicionar NDepend. Isso pode ser porque e uma operacao cara e ou que eu tive o script executando testes de unidade e Simian ao mesmo tempo (e apenas proc dual). Alguns posts atras falamos sobre um script de compilacao pos compilacao que o CCNET correu apos a tarefa do editor de log. Eu usei a tarefa asyncexec la tambem, mas de maneira ligeiramente diferente. Nao esta a espera de uma saida. Nao ha necessidade de completar o trabalho no script de compilacao pos antes de iniciar uma nova compilacao. Eu acho que NDepend pode ser movido para o script de compilacao de postagem. Isso nos permitiria ganhar NDepend e Simian por uma soma total de 30 segundos (note que isso e apenas preciso se outra compilacao nao for iniciada imediatamente). Nao e um preco ruim. Abaixo esta o alvo principal do script nant. Foi codificado por cores para coincidir com a tabela acima. O nome do alvo 8220 Disparado 8220 depende 8220 SetUps 8220 gt lt descricao gt Begin Main Build lt descricao gt lt descricao gt Begin Pre Build Actions lt descricao gt lt call target 8220 SourceModificationReport. ConsolidateReports 8220 gt lt target target 8220 Tracker. Queries 8220 gt lt asyncexec Nome da tarefa 8220 TrackerReport 8220 programa 8220 8220 failonerror 8220 Falso 8220 gt lt arg line 8220 - buildfile:.PackagesVisualSourceSafeVSS. Target. xml 8220 gt lt arg line 8220 Tracker. Report 8220 gt lt arg line 8220 - D: Tracker. QueryScrList 8220 gt lt arg Linha 8220 - logger: NAnt. Core. XmlLogger 8220 gt lt arg line 8216 - logfile: 8221 TrackerReport. xml8221 8216 gt lt asyncexec gt lt descricao gt End Pre Build Acoes lt descricao gt lt descricao gt Begin Clean Up Actions lt descricao gt lt asyncexec Nome da tarefa 8220 programa GetOfThirdPartyDirectory 8220 8220 8220 failonerror 8220 False 8220 resultproperty 8220 GetOfThirdPartyDirectoryResult 8220 gt lt arg line 8220 - bu Ildfile:.PackagesVisualSourceSafeVSS. Target. xml 8220 gt lt arg line 8220 SourceControl. GetOfThirdPartyDirectory 8220 gt lt arg line 8220 - logger: NAnt. Core. XmlLogger 8220 gt lt arg line 8216 - logfile: 8221 GetOfThirdPartyDirectory. xml8221 8216 gt lt asyncexec gt lt Destino de chamada 8216 SourceControl. GetOfProductDirectory 8216 gt