Re: Packing a C# project.

"Isak Savo" <[email protected]>
Newsgroups gmane.comp.autopackage.devel
Message-ID <[email protected]>
On Wed, Jun 4, 2008 at 10:33 PM, Neil Munro <[email protected]> wrote:
>
> 2008/6/4 Isak Savo <[email protected]>:
>>
>> On Wed, Jun 4, 2008 at 9:46 PM, Neil Munro <[email protected]> wrote:
>> >
>>
>> Just a reminder: Binreloc solves the problem when the software is
>> *INSTALLED* on the target system. It does make it a bit trickier for
>> us poor developers but IMO that's a fair price to pay.
>
> It's why I want to learn autopackage, tis easier for end users, I'm just
> trying to work out the quirks for developing with it. So do I just move
> files and folders around until it works?

You have two options:
1) Don't use binreloc when you are running from your source directory
(i.e. when you are running from MonoDevelop)
2) Use "custom commands" in monodevelop to copy everything to the
directory layout that is equal to the one it would be on the user's
system.

For 1) you can either do it by using #if statements (which are
pre-processor macros):


#if DEBUG
 string myImageFile = "../../images/image.png" // Assuming the image
is in the main source directory
#else
 string myImageFile = Path.Combine(BinReloc.DataDir,
"yourprogram/images/image.png"); // Assuming image is installed in
$PREFIX/share/yourprogram/images/image.png
#endif

Image myImage = new Image(myImageFile);
//... and so on

If using this method, you would just compile in Debug mode (there's a
combo box in monodevleop to change) when debugging, and then compile
in release mode when you make a release (when you make your
autopackage). Monodevelop will then use the first line when in Debug
mode, and the second line when in Release mode.

You could also do it without #if-statements, and rely on normal
if-statements that are checked when the program is running (instead of
#if, which is checked when compiling):

if (File.Exist("../../images/image.png"))
   myImageFile = "../../images/image.png";
else
  myImageFile = Path.Combine(Binreloc.DataDir ... //etc...

That way, it doesn't matter which compile mode you build the program
in, it'll always just work.

For 2), you'd have to setup MonoDevelop to actually copy everything to
a location on your disk and run it from there. This method would
require you to write some shell scripts. You can configure custom
commands by right clicking on your project file in monodevelop, select
properties and then navigate to
Configurations -> Debug (Active) -> Custom Commands.

(I'm not sure about the names, I'm running monodevelop in swedish)

The benefit of doing 2) is that you will always test your code the way
it would run on the users system.

> I set the output directory in MD to be /whatever/bin/Debug/bin with the
> intention of /whatever/bin/Debug/share /whatever/bin/Debug/etc being there
> as well, with the clear separation of binarys, data files and config files.
> My problem is that this set up does not work. It is in fact looking for
> /whatever/bin/share I don't understand why this is.
>
> Unless it's working relative to the current working directory I imagine a
> work around Path.Combine( BinReloc.DataDir, "../file" ) would work, but
> that's not really the point is it?

No :)

> Could this all just be a quirk of the .Net framework, MonoDevelop, me or a
> combination of all of the above?

It's just that it's a bit hard to get everything to play nice
together. Use one of the solutions I highlighted above (1 or 2) and
you should be fine...

> In which case, I am half tempted to say the files I am working with should be in $PREFIX/etc since the files I am
> working with are probably best described as configuration files.

I was a bit unclear, "/etc" is mostly used for system configuration
files. Normal applications rarely place anything there, mostly servers
and fundamental system tools do that. (There are a few exceptions to
this rule though, for example programs that use the GConf
configuration system, like the GNOME apps, they put their default
configuration values there.. but that's a completely different story..
let's not go there right now :)

Configuration files which are ment to be changed by the user should be
stored in the users home directory. Typically, you would store them in
~/.config/yourprogram or something like that (either just one file, or
a directory with multiple files depending on how much configuration
files you need.. probably just one!)

Anything else should most likely go to $prefix/share/yourprogram.

-Isak

---------------------------------------------------------------------
To unsubscribe, e-mail: autopackage-dev-unsubscribe-OfajU3CKLf1/[email protected]
For additional commands, e-mail: autopackage-dev-help-OfajU3CKLf1/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.