Fale 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 construção. Agora, obter um programa C para executar um programa é direto, mas para que ele execute um programa e passar nesse programa, um arquivo é diferente. Veja, NAnt é executado em uma janela de linha de comando. O meu programa C DEVE executar NAnt na janela da linha de comando e passá-lo um argumento que será o arquivo. build para compilar e construir. Obviamente, o NAnt leva o arquivo. build e executa ações de construção, então apenas abrir o arquivo. build do programa C não invoca NAnt para fazer isso. Como faço para isso, minha fraca tentativa, composta de bits de código encontrado e minhas próprias modificações: string targetDir targetDir string. Format (quotC: Documents and SettingsHPAdministratorMy DocumentsYEAR 6Sem1PROJDeliverMinTestMinTestMinTestquot) compilador new Process () necessário para iniciar o NAnt executando como Um processo, direito compiler. StartInfo. WorkingDirectory targetDir compiler. StartInfo. FileName quotNAnt. exequot a ferramenta para executar na compilação de linha cmd. StartInfo. Arguments quotdefault. buildquot o arquivo de compilação para passar para NAnt no compilador de linha cmd. StartInfo. UseShellExecute Forças verdadeiras o cmdline a ser usado, compiler. StartInfo. RedirectStandardOutput compilador falso. Start () quarta-feira, 2 de abril de 2008 4:08 Você tem alguns erros simples em seu arquivo de compilação. Então, eu vou passar por cima das suas perguntas um por vez. Re: Eu não quero executar o aplicativo o tempo todo, basta construí-lo, mas quando eu retirar (3) a parte responsável por executar o programa construído, o arquivo de compilação não faz mais nada. É como se esvaziei todo o arquivo. build. O problema aqui é que o objetivo padrão do projeto, especificado na propriedade quotdefaultquot: ltproject namequotMinTestquot defaultquotrunquotgt é o destino quotrunquot. Então, uma vez que você remove esse alvo, nada acontece. Você tem duas opções: Mude o alvo padrão para qualquer outro alvo que deseja executar. Lembre-se de que a configuração do quotnantTargetquot pode passar para a função, passar o alvo que deseja executar. Outro problema é que o quotrunquot de destino padrão atual depende do quotbuildquot target: Se você quiser apenas criar, mas não executar, substitua o nome do arquivo lttarget dependquotbuildquotgt ltexec programquotbin. exequot basedirquot. quotgt lttarget namequotrunquot dependequotbuildquotgt lttargetgt make quotbuildquot o alvo padrão como em: ltproject namequotMinTestquot defaultquotbuildquotgt ou chame o destino quotbuildquot diretamente como descrito em 2 acima. Re: Se eu quiser apenas limpar arquivos já na pasta bin (deixar apenas o alvo 1 e excluir 2 e 3, etc.), ele não os exclui. O mesmo que o anterior se aplica aqui, altere o alvo padrão para quotcleanquot ou chame o quotcleanquot do seu script. Por sinal, se você estiver em algum lugar perto da área 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 apresentação disponível no meu blog depois disso. Quinta-feira, 03 de abril de 2008 11:52 PM Meu palpite é que NAnt. exe e default. build estão em diretórios separados. Talvez seja necessário especificar o diretório de um ou outro dos arquivos. A instância do Processo estará procurando por esses dois arquivos no mesmo diretório. No entanto, você tem a ideia certa. Algumas outras coisas, se NAnt for um utilitário de linha de comando, não há motivo para chamar Console. WriteLine (compilador. StandardOutput. ReadToEnd ()), ou defina RedirectStandardOutput como falso ou configure UseShellExecute como verdadeiro. Essas coisas já devem estar configuradas para que você mostre os resultados em uma janela de console. Além disso, você não precisa usar string. Format ou declarar a variável targetDir em uma linha separada. Você poderia facilmente colocar algo como quotestring targetDir quotC: Documents. (Blá blá). MinTestquotquot Mais uma coisa, por curiosidade, por que você está usando NAnt, quando você tem o compilador c maravilhoso em seu computador. Verifique as subpastas de C: WindowsMicrosoftFrameworkv2.0.50727 ou C: WindowsMicrosoftFrameworkv3.0 ou 3.5. Você deve encontrar o compilador do Microsoft C por baixo. Quarta-feira, 02 de abril de 2008 4:43 AM Aqui está uma função que uso. Demora um StringDictionary como parâmetros e executa uma tarefa NAnt com um determinado arquivo de compilação. A parte que é mais relevante para você é o código no bloco trycatch. vazio runTask (parâmetros 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)) lançar novo DirectoryNotFoundException (string. Format (quotCould não encontrar o diretório NAnt ().quot, nantDirectory)) if (File. Exists (nantBuildFile) ) Lançar novo FileNotFoundException (string. Format (quotCould não encontrar o arquivo de compilação 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)) lançar nova Exceção (a tarefa quotNAnt falhou: quot Environment. NewLine nantArguments Environment. NewLine quotwith outputquot Environment. NewLine nantOutput) catch (exceção de exceção) lançar nova Exceção (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 não fazendo alguma solução alternativa. Parece que funciona de maneira diferente de você, e isso é o que me preocupa. Você está atribuindo uma propriedade Arguments a um monte de argumentos (-d: TargetSite, etc.), enquanto que agora não estou. Estou executando NAnt ONTARGETED no diretório onde o arquivo. build é encontrado, e eu acho que NAnt está apenas executando qualquer arquivo. build que ele encontra nesse diretório. Na publicação acima, mencionei que NAnt vem descompactando quando há dois arquivos de compilação na mesma pasta. Isso pode prejudicar meu programa. Eu preciso de uma solução para isso, não uma solução alternativa - que é o que eu sinto que estou fazendo agora mesmo. Eu sinto que eu deveria estar fornecendo o arquivo. build como um argumento e não deixar o NAnt para executar automaticamente o arquivo. build que encontra em uma pasta. E se dois arquivos do. build estiverem em um diretório Meu programa vai cair. Desculpe, eu sou novato não tecnológico, e eu não sei se estou fazendo isso tudo bem. Quarta-feira, 02 de abril de 2008 1:55 PM Ok, não há problema. Eu revisei a função para suas necessidades. Você chamaria da seguinte maneira: Declare as variáveis locais com o seu caminho para NAnt, arquivo de compilação 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 padrão nantOutput runTask (nantDirectory, nantBuildFile, null) Especifique o destino para executar dentro de seu arquivo de compilação nantOutput runTask (nantDirectory, nantBuildFile, nantTarget) E aqui a função revisada: runTask de string pública (String nantDirectory, String buildFile, String NantTarget) string nantOutput String. Empty if (Directory. Exists (nantDirectory)) lançar novo DirectoryNotFoundException (string. Format (quotCould não encontrar o diretório NAnt ().quot, nantDirectory)) se (File. Exists (nantBuildFile)) lançar FileNotFoundException novo (String. Format (não pode encontrar o arquivo de compilação 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 variações deste arquivo de construção: 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 compilação e compilar o aplicativo lttarget namequotrunquot dependequotbuildquotgt executar o aplicativo (3) ltexec programquotbin. exequot basedirquot. quotgt lttargetgt final da execução do aplicativo (3 ) Ltprojectgt Eu uso o arquivo como está acima, e eu tenho variações dele, onde eu só quero que ele seja LIMPIO, LIMPIAR E CONSTRUIR, MAS NÃO EXECUTAR O PROGRAMA, etc. Isso não funciona nas seguintes circunstâncias: - Eu não quero executar O aplicativo o tempo todo, basta compilá-lo, mas quando eu retirar (3) a parte responsável pela execução do programa construído, o arquivo de compilação não faz mais nada. É como se esvaziei todo o arquivo. build. - Se eu quiser apenas limpar arquivos já na pasta bin (deixar apenas o alvo 1 e excluir 2 e 3, etc.), ele não os exclui. No entanto, quando eu executo NAnt limpo no diretório bin FROM THE COMMANDLINE WINDOW, ele exclui os arquivos bem. Mas, não é como se o programa C (o bloco com o Processo) não funcionasse AT ALL. Pode criar os arquivos se o diretório estiver vazio primeiro. Não parece substituir os arquivos também. Quinta-feira, 03 de abril de 2008 11:38 PM Você tem alguns erros simples em seu arquivo de compilação. Então, eu vou passar por cima das suas perguntas um por vez. Re: Eu não quero executar o aplicativo o tempo todo, basta construí-lo, mas quando eu retirar (3) a parte responsável por executar o programa construído, o arquivo de compilação não faz mais nada. É como se esvaziei todo o arquivo. build. O problema aqui é que o objetivo padrão do projeto, especificado na propriedade quotdefaultquot: ltproject namequotMinTestquot defaultquotrunquotgt é o destino quotrunquot. Então, uma vez que você remove esse alvo, nada acontece. Você tem duas opções: Mude o alvo padrão para qualquer outro alvo que deseja executar. Lembre-se de que a configuração do quotnantTargetquot pode passar para a função, passar o alvo que deseja executar. Outro problema é que o quotrunquot de destino padrão atual depende do quotbuildquot target: Se você quiser apenas criar, mas não executar, substitua o nome do arquivo lttarget dependquotbuildquotgt ltexec programquotbin. exequot basedirquot. quotgt lttarget namequotrunquot dependequotbuildquotgt lttargetgt make quotbuildquot o alvo padrão como em: ltproject namequotMinTestquot defaultquotbuildquotgt ou chame o destino quotbuildquot diretamente como descrito em 2 acima. Re: Se eu quiser apenas limpar arquivos já na pasta bin (deixar apenas o alvo 1 e excluir 2 e 3, etc.), ele não os exclui. O mesmo que o anterior se aplica aqui, altere o alvo padrão para quotcleanquot ou chame o quotcleanquot do seu script. Por sinal, se você estiver em algum lugar perto da área 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 apresentação disponível no meu blog depois disso. Quinta-feira, 03 de abril de 2008 23:52 Boyan, apenas uma atualização rápida sobre o progresso. Você percebe que você está potencialmente salvando um diploma (projeto do ano final da dissertação). Eu não posso agradecer o suficiente. TAMBÉM, você me alertou sobre o significado do atributo padrão do tag ltprojectgt. Eu tentei uma das suas dicas, e meu programa agora exclui o MinTest. exe e MinTest. pdb da bandeja. Há mais testes que eu preciso executar, mas isso é mais progresso do que eu fiz todo o dia. PS: Eu não posso acreditar nisso na INTERNET, há menos forumites em fóruns de programação do que nos fóruns de fofocas de celebridades ou fóruns de depressão, etc. Aprendo espanhol e vou em um fórum venezuelano para falar sobre o lobo ditador esquerdista em roupas de carneiros, Chavez, e há 1 resposta a cada 3 minutos (e 13 a população não tem eletricidade). Isso não faz sentido. Então, eu realmente aprecio você pesando aqui, porque sabe o quanto eu esperaria. Oh, bem, durante a noite, a programação agora. São 3:10 da manhã. Eu adoraria ir à sua conferência - engraçado, você deve mencionar a Nova Inglaterra. Estou na Inglaterra antiga. Sim, eu moro em Londres, Reino Unido, então eu não 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 Você é bem-vindo. Se você ainda não pudesse contar, adoro programar e adoro NAnt. É uma ferramenta muito poderosa que muitas pessoas não conhecem. Se você precisar de ajuda mais imediata, vá 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 está realizando uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Você gostaria de participar. Eu tenho trabalhado para trazer o tempo de compilação para o nosso desenvolvedor enfrentando a construção para algo menos de 5 minutos. Acabei recentemente de ter menos de 5. Atualmente, não 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 começando base. ExecuteTask em um novo tópico. Tem um atributo adicional que deve ser definido: nome da tarefa. Taskname é usado para rastrear o tópico. 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 irá comportar o mesmo que simplesmente chamar essa tarefa exec. As coisas ficam interessantes quando você começa 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 compilação 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 dará alguns antecedentes sobre como o script de compilação é configurado. Existe um alvo análogo ao sub Main. Neste destino principal, os alvos dos Pacotes são chamados. A tabela abaixo contém informações de tempo sobre esses destinos: como os objetivos coloridos são executados ao mesmo tempo. Eu executei os scripts muitas vezes para ter uma idéia de qualquer variação. Os dados acima são de corridas médias. As coisas pareciam muito boas até eu adicionar NDepend. Isso pode ser porque é uma operação cara e ou que eu tive o script executando testes de unidade e Simian ao mesmo tempo (é apenas proc dual). Alguns posts atrás falamos sobre um script de compilação pós compilação que o CCNET correu após a tarefa do editor de log. Eu usei a tarefa asyncexec lá também, mas de maneira ligeiramente diferente. Não está à espera de uma saída. Não há necessidade de completar o trabalho no script de compilação pós antes de iniciar uma nova compilação. Eu acho que NDepend pode ser movido para o script de compilação de postagem. Isso nos permitiria ganhar NDepend e Simian por uma soma total de 30 segundos (note que isso é apenas preciso se outra compilação não for iniciada imediatamente). Não é um preço ruim. Abaixo está 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 descrição gt Begin Main Build lt descrição gt lt descrição gt Begin Pre Build Actions lt descrição 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 descrição gt End Pre Build Ações lt descrição gt lt descrição gt Begin Clean Up Actions lt descrição 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
No comments:
Post a Comment