Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Projektifailien kopiointi kehityskoneelta serverille

Sivun loppuun

Macro [16.02.2014 12:00:48]

#

Terve

Teen tässä yhtä nettisivuprojektia Netbeansin versiolla 7.4. Netbeansin asetuksista olen asettanut Netbeansin kopioimaan kaikki projektitiedostot automaattisesti serverilleni, joka on Windowsiin mountattu verkkolevyksi.

Ongelma tässä on se, että aina kun vaihdan konetta, Netbeans huomaa, että tiedostot eivät ole sen koneen Netbeansin sinne lataamia, ja alkaa lähettämään niitä uudestaan. Vaikka onkin nopea nettiyhteys (sisäverkossa gigabitin nopeudet, ulkoverkkoonkin on 100/10), tässä siirrossa kestää aivan järkyttävän kauan. Projektissa on noin 5000 tiedostoa, mutta kokoa näillä on yhteensä vain noin 60 MB.

Olisiko jotain ohjelmaa, joka tarkkailisi kansion muutoksia, ja aina kun tiedosto luodaan, sitä muokataan tai poistetaan, se tekisi verkkolevyllä samat operaatiot? Windowsissa on sisäänrakennettuna ohjelma nimeltä mklink, mutta tämä ei tue verkkolevyjä. Kaikista paras olisi sellainen, jonka voisi käynnistää komentoriviltä: cd-komennolla siirtyisi projektihakemiston juureen, käynnistäisi ohjelman jollain komennolla filecopy watch tms. ja se tarkkailisi muutoksia.

Metabolix [16.02.2014 15:02:00]

#

En ymmärrä, mitä oikeastaan haluat, eli kysymyksessäsi taitaa olla XY-ongelma. Miksi ja milloin tiedostot pitää saada tuonne verkkolevylle? Miten SVN liittyy asiaan? Vaikuttaa, että siirrät siis saman projektin tiedostoja kahdella eri tavalla.

Hakemiston muutoksia voi valvoa System.IO.FileSystemWatcher-luokalla. MSDN:n esimerkin pohjalta on helppo tehdä ohjelma, joka vahtii tiedostoja ja muutosten tullessa kopioi tiedoston tai suorittaa kopiointia varten toisen ohjelman (esim. rsync).

Voisit toisaalta myös pitää projektia kokonaan verkkolevyllä, jolloin muutoksetkin menisivät sinne ilman erillistä kopiointia, tai voisit tehdä SVN-palvelimelle skriptin, joka kopioi tiedostot, jolloin muutokset tapahtuisivat automaattisesti commitin yhteydessä.

Macro [16.02.2014 16:11:53]

#

En nyt sitten tiedä miten oisin helpommin voinut kysyä... jos teen muutoksen kansioon X, mikä ohjelma voisi tehdä saman muutoksen kansioon Y?

Metabolix [16.02.2014 16:33:24]

#

Ei ole kyse siitä, onko kysymys tiivis tai helppo, vaan siitä, mitä edes kysyt. Kysyt, miten kopioidaan tiedostoja, koska ajattelet, että se on hyvä ratkaisu ongelmaasi. (Annoinkin jo joitain ohjeita siihen.) Kuitenkin ensimmäisestä viestistä näkyy, että lopullinen päämääräsi ei ole pelkkä tiedostojen kopiointi vaan yrität ratkaista kopioinnilla jotain toista ongelmaa, joka nyt liittyi osittain myös johonkin Netbeansin automaattiseen toimintoon. Siksi sinun kannattaisi selittää, mikä on varsinainen ongelma: Miksi koodi pitää mielestäsi saada verkkolevylle? Haluatko testata koodia juuri tietyllä palvelimella vai muuten vain sopivassa ympäristössä, vai mistä on kyse? Kun kerrot tarkasti, mitä haluat, joku muu voi osata kertoa, mikä on siihen paras ratkaisu – ehkäpä jokin ihan muu kuin tiedostojen kopiointi verkkolevylle erillisellä ohjelmalla.

Macro [16.02.2014 16:58:26]

#

Ongelma: Netbeans on hidas kopioimaan muokatut tiedostot verkkolevylle

Ratkaisu: Tarvitaan ohjelma, joka kopioi tiedostot projektihakemistosta toiseen kansioon.

Kysymys: Mikä ohjelma?

Seuraavat EIVÄT ole mahdollisia ratkaisutapoja:

- Paikallinen palvelin
- FTP
- Linux

PS. Voitaisiin pistää seuraavaksi kyselyksi "Miksi et kysele?". Vastaisin, että ylimielisten ihmisten takia. Kiitos ja näkemiin.

timoh [16.02.2014 17:31:49]

#

Etkös tuossa pääsisi helpoimmalla jos määrität kaikilta koneilta NetBeansin käyttämään yhtä ja samaa projektikansiota metadatoineen?

Arvelen että NetBeans ei tällöin eri koneilta käytettynä mene sekaisin mitä pitäisi päivittää.

Grez [17.02.2014 04:56:41]

#

Projektifail :D

Metabolix [17.02.2014 17:46:59]

#

Macro kirjoitti:

PS. Voitaisiin pistää seuraavaksi kyselyksi "Miksi et kysele?". Vastaisin, että ylimielisten ihmisten takia. Kiitos ja näkemiin.

Mikä ihme tässä nyt mielestäsi oli ylimielistä? Annoin jo ensimmäisessä viestissäni sinulle ratkaisut siihen, mitä kysyit: ota MSDN:stä FileSystemWatcher-esimerkki ja laita se suorittamaan vaikka rsync sopivilla parametreilla tai lisää siihen ne pari triviaalia koodiriviä, joilla tiedostot saa kohdalleen. Sen jälkeen olen yrittänyt mielestäni aivan asiallisesti selittää, että tämä kopioiminen on luultavasti aivan typerä ratkaisu siihen todelliseen ongelmaasi, joka ei edelleenkään ole verkkolevylle kopioinnin hitaus vaan se, miksi edes kopioit jotain verkkolevylle. Siis jos selittäisit nyt, miten kehität projektiasi ja mitä varten se verkkolevy on edes olemassa, varmaan saisit jonkin vastauksen siihen, mitä oikeasti kannattaisi tehdä.

Macro [17.02.2014 19:41:17]

#

Metabolix kirjoitti:

Mikä ihme tässä nyt mielestäsi oli ylimielistä?

Puhuin yleisesti tämän foorumin vuoden tai kahden aikaisesta suuntauksesta... Pari henkilöä koittaa päteä kilpaa ja joka ikisessä keskustelussa valitetaan jostain.

Metabolix kirjoitti:

Annoin jo ensimmäisessä viestissäni sinulle ratkaisut siihen, mitä kysyit: ota MSDN:stä FileSystemWatcher-esimerkki ja laita se suorittamaan vaikka rsync sopivilla parametreilla tai lisää siihen ne pari triviaalia koodiriviä, joilla tiedostot saa kohdalleen.

Miksi luulet, että postasin kysymyksen yleisen keskustelun alueelle? Jos haluan toteuttaa itse ohjelman esimerkiksi C#:lla, olisin kai laittanut sen oikealle alueelle ja muotoillut kysymyksen toisin. En muistaakseni kysynyt miten tiedostomuutoksia kuunnellaan C#:lla, jos en nyt ihan väärin itseäni ole tulkinnut.

Metabolix kirjoitti:

Sen jälkeen olen yrittänyt mielestäni aivan asiallisesti selittää, että tämä kopioiminen on luultavasti aivan typerä ratkaisu siihen todelliseen ongelmaasi, joka ei edelleenkään ole verkkolevylle kopioinnin hitaus vaan se, miksi edes kopioit jotain verkkolevylle. Siis jos selittäisit nyt, miten kehität projektiasi ja mitä varten se verkkolevy on edes olemassa, varmaan saisit jonkin vastauksen siihen, mitä oikeasti kannattaisi tehdä.

Tällä niin kauhealla verkkolevyllä on verkkopalvelimeni sivut. Jotkut kopioivat tiedostoja FTP:llä, jotkut tekevät näin...

Kun en kysynyt vaihtoehtoista tapaa, niin jos ei kysymykseen osaa vastata, voi sen jättää huomioimatta. Olisin varmaan kertonut, jos haluaisin tehdä sen toisella tavalla. Muutenkin on ihan turha alkaa neuvomaan miten itse tekisit, jos kysyjällä on selvä näkemys mitä tarvitsee tehdä.

Metabolix [17.02.2014 20:40:35]

#

Macro kirjoitti:

Miksi luulet, että postasin kysymyksen yleisen keskustelun alueelle?

Esim. siksi, että et erityisesti halunnut koodata jollain tietyllä kielellä. Ei se minusta silti tarkoita, etteikö koodaaminen olisi ihan käypä ratkaisu ongelmaan.

Hauskasti sen ohjelman toteuttamiseen yllä linkittämäni esimerkin pohjalta tarvitaan vähemmän uutta tekstiä kuin kaikkeen tuohon valitukseesi siitä, että ratkaisu ei ole sinulle mieleinen. Tässä se nyt on:

using System;
using System.IO;
using System.Security.Permissions;

public class CopyOnChange {
	static string Source, Destination;
	public static void Main() {
		Run();
	}

	[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
	public static void Run() {
		string[] args = System.Environment.GetCommandLineArgs();

		if (args.Length != 3) {
			Console.WriteLine("Usage: CopyOnChange.exe (src) (dest)");
			return;
		}
		Source = Path.GetFullPath(args[1]);
		Destination = Path.GetFullPath(args[2]);

		FileSystemWatcher watcher = new FileSystemWatcher();
		watcher.Path = Source;
		watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
		watcher.Changed += new FileSystemEventHandler(OnChanged);
		watcher.Created += new FileSystemEventHandler(OnChanged);
		watcher.Deleted += new FileSystemEventHandler(OnDeleted);
		watcher.Renamed += new RenamedEventHandler(OnRenamed);
		watcher.IncludeSubdirectories = true;
		watcher.EnableRaisingEvents = true;
		Console.WriteLine("Press 'q' to quit.");
		while (Console.Read() != 'q');
	}

	private static void Delete(string src) {
		string dest = Path.Combine(Destination, src.Substring(Source.Length));
		try { Directory.Delete(dest, true); } catch (Exception) {}
		try { File.Delete(dest); } catch (Exception) {}
	}

	private static void Create(string src) {
		string dest = Path.Combine(Destination, src.Substring(Source.Length));
		if (Directory.Exists(src)) {
			try { Directory.CreateDirectory(dest); } catch (Exception) {}
		} else {
			try { Directory.Delete(dest, true); } catch (Exception) {}
			try { File.Copy(src, dest, true); } catch (Exception) {}
		}
	}

	private static void OnChanged(object source, FileSystemEventArgs e) {
		Create(e.FullPath);
	}

	private static void OnDeleted(object source, FileSystemEventArgs e) {
		Delete(e.FullPath);
	}

	private static void OnRenamed(object source, RenamedEventArgs e) {
		Delete(e.OldFullPath);
		Create(e.FullPath);
	}
}

Laitoin binäärin soodan fpasteen. Käyttö: CopyOnChange.exe C:/Macro/ Z:/Verkkolevy/

Jos ohjelmasta puuttuu jotain, et varmaan valita, koska onhan se aivan speksisi mukainen: ”aina kun tiedosto luodaan, sitä muokataan tai poistetaan, se tekisi verkkolevyllä samat operaatiot”. Olisit varmaan kertonut, jos haluaisit sen toimivan toisella tavalla.

vuokkosetae [19.02.2014 09:17:32]

#

Viimeksi kun kokeilin, niin tälle marginaalikäyttöjärjestelmälle oli tarjolla GIT. Käske netbeansista gitin päivittää testialustaasi ja kun haluat julkaista uuden version, päivitä gitillä tuotanto. Ainakin eclipsestä moinen taikuus onnistuu.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta